{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "对应`tf.kears` 版本的03，在训练过程中加入更多的控制\n",
    "\n",
    "1. 训练中保存/保存最好的模型\n",
    "2. 早停 \n",
    "3. 训练过程可视化\n",
    "\n",
    "<font color=\"red\">注</font>: 使用 tensorboard 可视化需要安装 tensorflow (TensorBoard依赖于tensorflow库，可以任意安装tensorflow的gpu/cpu版本)\n",
    "\n",
    "```shell\n",
    "pip install tensorflow\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-25T08:29:18.386910Z",
     "start_time": "2025-01-25T08:29:15.350285Z"
    }
   },
   "source": [
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import sklearn\n",
    "import pandas as pd\n",
    "import os\n",
    "import sys\n",
    "import time\n",
    "from tqdm.auto import tqdm\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "\n",
    "print(sys.version_info)\n",
    "for module in mpl, np, pd, sklearn, torch:\n",
    "    print(module.__name__, module.__version__)\n",
    "    \n",
    "device = torch.device(\"cuda:0\") if torch.cuda.is_available() else torch.device(\"cpu\")\n",
    "print(device)  #设备是cuda:0，即GPU，如果没有GPU则是cpu\n"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "sys.version_info(major=3, minor=12, micro=3, releaselevel='final', serial=0)\n",
      "matplotlib 3.10.0\n",
      "numpy 1.26.4\n",
      "pandas 2.2.3\n",
      "sklearn 1.6.1\n",
      "torch 2.5.1+cpu\n",
      "cpu\n"
     ]
    }
   ],
   "execution_count": 1
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据准备"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-25T08:29:19.717991Z",
     "start_time": "2025-01-25T08:29:18.387914Z"
    }
   },
   "source": [
    "from torchvision import datasets\n",
    "from torchvision.transforms import ToTensor\n",
    "\n",
    "# fashion_mnist图像分类数据集\n",
    "train_ds = datasets.FashionMNIST(\n",
    "    root=\"data\",\n",
    "    train=True,\n",
    "    download=True,\n",
    "    transform=ToTensor()\n",
    ")\n",
    "\n",
    "test_ds = datasets.FashionMNIST(\n",
    "    root=\"data\",\n",
    "    train=False,\n",
    "    download=True,\n",
    "    transform=ToTensor()\n",
    ")\n",
    "\n",
    "# torchvision 数据集里没有提供训练集和验证集的划分\n",
    "# 当然也可以用 torch.utils.data.Dataset 实现人为划分"
   ],
   "outputs": [],
   "execution_count": 2
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-25T08:29:19.723956Z",
     "start_time": "2025-01-25T08:29:19.718996Z"
    }
   },
   "source": [
    "# 从数据集到dataloader\n",
    "train_loader = torch.utils.data.DataLoader(train_ds, batch_size=32, shuffle=True)\n",
    "val_loader = torch.utils.data.DataLoader(test_ds, batch_size=32, shuffle=False)"
   ],
   "outputs": [],
   "execution_count": 3
  },
  {
   "cell_type": "code",
   "source": [
    "# 查看数据\n",
    "for datas, labels in train_loader:\n",
    "    print(datas.shape)\n",
    "    print(labels.shape)\n",
    "    break\n",
    "#查看val_loader\n",
    "for datas, labels in val_loader:\n",
    "    print(datas.shape)\n",
    "    print(labels.shape)\n",
    "    break"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-01-25T08:29:19.739520Z",
     "start_time": "2025-01-25T08:29:19.724958Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n"
     ]
    }
   ],
   "execution_count": 4
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 定义模型"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-25T08:29:19.746498Z",
     "start_time": "2025-01-25T08:29:19.740373Z"
    }
   },
   "source": [
    "class NeuralNetwork(nn.Module):\n",
    "    def __init__(self):\n",
    "        super().__init__()\n",
    "        self.flatten = nn.Flatten()\n",
    "        self.linear_relu_stack = nn.Sequential(\n",
    "            nn.Linear(28 * 28, 300),  # in_features=784, out_features=300\n",
    "            nn.ReLU(),\n",
    "            nn.Linear(300, 100),\n",
    "            nn.ReLU(),\n",
    "            nn.Linear(100, 10),\n",
    "        )\n",
    "\n",
    "    def forward(self, x):\n",
    "        # x.shape [batch size, 1, 28, 28]\n",
    "        x = self.flatten(x)  \n",
    "        # 展平后 x.shape [batch size, 28 * 28]\n",
    "        logits = self.linear_relu_stack(x)\n",
    "        # logits.shape [batch size, 10]\n",
    "        return logits\n",
    "    \n",
    "model = NeuralNetwork()"
   ],
   "outputs": [],
   "execution_count": 5
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 训练\n",
    "\n",
    "pytorch的训练需要自行实现，包括\n",
    "1. 定义损失函数\n",
    "2. 定义优化器\n",
    "3. 定义训练步\n",
    "4. 训练"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-25T08:29:19.798725Z",
     "start_time": "2025-01-25T08:29:19.748058Z"
    }
   },
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "@torch.no_grad()\n",
    "def evaluating(model, dataloader, loss_fct):\n",
    "    loss_list = []\n",
    "    pred_list = []\n",
    "    label_list = []\n",
    "    for datas, labels in dataloader:\n",
    "        #datas.shape [batch size, 1, 28, 28]\n",
    "        #labels.shape [batch size]\n",
    "        datas = datas.to(device)\n",
    "        labels = labels.to(device)\n",
    "        # 前向计算\n",
    "        logits = model(datas)\n",
    "        loss = loss_fct(logits, labels)         # 验证集损失\n",
    "        loss_list.append(loss.item()) # tensor.item() 获取tensor的数值，loss是只有一个元素的tensor\n",
    "        \n",
    "        preds = logits.argmax(axis=-1)    # 验证集预测, axis=-1 表示最后一个维度,因为logits.shape [batch size, 10]，所以axis=-1表示对最后一个维度求argmax，即对每个样本的10个类别的概率求argmax，得到最大概率的类别, preds.shape [batch size]\n",
    "        pred_list.extend(preds.cpu().numpy().tolist()) # tensor转numpy，再转list\n",
    "        label_list.extend(labels.cpu().numpy().tolist())\n",
    "        \n",
    "    acc = accuracy_score(label_list, pred_list) # 验证集准确率\n",
    "    return np.mean(loss_list), acc # 返回验证集平均损失和准确率\n"
   ],
   "outputs": [],
   "execution_count": 6
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# TensorBoard 可视化\n",
    "\n",
    "pip install tensorboard\n",
    "训练过程中可以使用如下命令启动tensorboard服务。注意使用绝对路径，否则会报错\n",
    "\n",
    "```shell\n",
    " tensorboard  --logdir=\"D:\\develop\\PG\\python\\code\\deep_learning_code\\chapter_2_torch\\runs\" # --host 0.0.0.0 --port 8848\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-25T08:29:22.803261Z",
     "start_time": "2025-01-25T08:29:19.799727Z"
    }
   },
   "source": [
    "from torch.utils.tensorboard import SummaryWriter\n",
    "\n",
    "\n",
    "class TensorBoardCallback:\n",
    "    def __init__(self, log_dir, flush_secs=10): \n",
    "        \"\"\"\n",
    "        Args:\n",
    "            log_dir (str): 写日志的目录\n",
    "            flush_secs (int, optional): 每隔 flush_secs 秒写入一次磁盘。默认为 10。\n",
    "        \"\"\"\n",
    "        self.writer = SummaryWriter(log_dir=log_dir, flush_secs=flush_secs)  # 实例化SummaryWriter, log_dir是log存放路径，flush_secs是每隔多少秒写入磁盘\n",
    "\n",
    "    def draw_model(self, model, input_shape):  # 画模型图\n",
    "        \"\"\"\n",
    "        :param model: 模型\n",
    "        :param input_shape: 初始尺寸\n",
    "        :return: \n",
    "        \"\"\"\n",
    "        self.writer.add_graph(model, input_to_model=torch.randn(input_shape))\n",
    "        \n",
    "    def add_loss_scalars(self, step, loss, val_loss):  # 画loss曲线\n",
    "        self.writer.add_scalars(\n",
    "            main_tag=\"training/loss\", \n",
    "            tag_scalar_dict={\"loss\": loss, \"val_loss\": val_loss},\n",
    "            global_step=step,\n",
    "            ) # 画loss曲线, main_tag是主tag，tag_scalar_dict是子tag，global_step是步数\n",
    "        \n",
    "    def add_acc_scalars(self, step, acc, val_acc):  # 画acc曲线\n",
    "        self.writer.add_scalars(\n",
    "            main_tag=\"training/accuracy\",\n",
    "            tag_scalar_dict={\"accuracy\": acc, \"val_accuracy\": val_acc},\n",
    "            global_step=step,\n",
    "        ) # 画acc曲线, main_tag是主tag，tag_scalar_dict是子tag，global_step是步数\n",
    "        \n",
    "    def add_lr_scalars(self, step, learning_rate):  # 画学习率lr曲线\n",
    "        self.writer.add_scalars(\n",
    "            main_tag=\"training/learning_rate\",\n",
    "            tag_scalar_dict={\"learning_rate\": learning_rate},\n",
    "            global_step=step,\n",
    "        ) # 画lr曲线, main_tag是主tag，tag_scalar_dict是子tag，global_step是步数\n",
    "    \n",
    "    def __call__(self, step, **kwargs):\n",
    "        # add loss,把loss，val_loss取掉，画loss曲线\n",
    "        loss = kwargs.pop(\"loss\", None)\n",
    "        val_loss = kwargs.pop(\"val_loss\", None)\n",
    "        if loss is not None and val_loss is not None:\n",
    "            self.add_loss_scalars(step, loss, val_loss) # 画loss曲线\n",
    "        # add acc\n",
    "        acc = kwargs.pop(\"acc\", None)\n",
    "        val_acc = kwargs.pop(\"val_acc\", None)\n",
    "        if acc is not None and val_acc is not None:\n",
    "            self.add_acc_scalars(step, acc, val_acc) # 画acc曲线\n",
    "        # add lr\n",
    "        learning_rate = kwargs.pop(\"lr\", None)\n",
    "        if learning_rate is not None:\n",
    "            self.add_lr_scalars(step, learning_rate) # 画lr曲线\n"
   ],
   "outputs": [],
   "execution_count": 7
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "## ModelCheckpoint（保存模型）\n",
    "1. 为了上线\n",
    "2. 避免模型中途训练终止，再次训练可以从上次保存点进行"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": "### Save Best 保存模型权重\n"
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-25T08:29:22.809428Z",
     "start_time": "2025-01-25T08:29:22.803557Z"
    }
   },
   "source": [
    "class SaveCheckpointsCallback:  # 保存最好的模型权重\n",
    "    def __init__(self, save_dir, save_step=500, save_best_only=True):\n",
    "        \"\"\"\n",
    "        Save checkpoints each save_epoch epoch. \n",
    "        We save checkpoint by epoch in this implementation.\n",
    "        Usually, training scripts with pytorch evaluating model and save checkpoint by step.\n",
    "\n",
    "        Args:\n",
    "            save_dir (str): dir to save checkpoint\n",
    "            save_epoch (int, optional): the frequency to save checkpoint. Defaults to 1.\n",
    "            save_best_only (bool, optional): If True, only save the best model or save each model at every epoch.\n",
    "        \"\"\"\n",
    "        self.save_dir = save_dir # 保存路径\n",
    "        self.save_step = save_step # 保存步数\n",
    "        self.save_best_only = save_best_only # 是否只保存最好的模型\n",
    "        self.best_metrics = -1 # 最好的指标，指标不可能为负数，所以初始化为-1\n",
    "        \n",
    "        # 如果不存在保存路径，则创建\n",
    "        if not os.path.exists(self.save_dir): \n",
    "            os.mkdir(self.save_dir)\n",
    "        \n",
    "    def __call__(self, step, state_dict, metric=None):\n",
    "        \"\"\"\n",
    "        :param step: 当前点的步数\n",
    "        :param state_dict: 模型权重\n",
    "        :param metric: 算子\n",
    "        :return: \n",
    "        \"\"\"\n",
    "        if step % self.save_step > 0:  # 每隔save_step步保存一次\n",
    "            return\n",
    "        \n",
    "        if self.save_best_only:\n",
    "            assert metric is not None # 必须传入metric\n",
    "            if metric >= self.best_metrics:\n",
    "                # save checkpoints\n",
    "                torch.save(state_dict, os.path.join(self.save_dir, \"best.ckpt\")) # 保存最好的模型，覆盖之前的模型，不保存step，只保存state_dict，即模型参数，不保存优化器参数\n",
    "                # update best metrics\n",
    "                self.best_metrics = metric\n",
    "        else:\n",
    "            torch.save(state_dict, os.path.join(self.save_dir, f\"{step}.ckpt\")) # 保存每个step的模型，不覆盖之前的模型，保存step，保存state_dict，即模型参数，不保存优化器参数\n",
    "\n"
   ],
   "outputs": [],
   "execution_count": 8
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Early Stop（早停）：避免过拟合\n",
    "1. min_delta：最小的提升幅度,绝对变化小于这个参数，就不视为改进\n",
    "2. patience：多少轮没有提升就停止训练"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-25T08:29:23.402120Z",
     "start_time": "2025-01-25T08:29:23.397896Z"
    }
   },
   "source": [
    "class EarlyStopCallback:\n",
    "    def __init__(self, patience=5, min_delta=0.01):\n",
    "        \"\"\"\n",
    "\n",
    "        Args:\n",
    "            patience (int, optional): 多少个轮没有提升就停止训练，默认为5。\n",
    "            min_delta (float, optional): 最小的变化幅度绝对变化小于这个参数，就不视为改进。默认为0.01。\n",
    "        \"\"\"\n",
    "        self.patience = patience # 多少个轮没有提升就停止训练\n",
    "        self.min_delta = min_delta # 最小的提升幅度\n",
    "        self.best_metric = -1\n",
    "        self.counter = 0  # 计数器，记录多少step没提升\n",
    "        \n",
    "    def __call__(self, metric):\n",
    "        if metric >= self.best_metric + self.min_delta:#用准确率\n",
    "            # update best metric\n",
    "            self.best_metric = metric\n",
    "            # reset counter \n",
    "            self.counter = 0\n",
    "        else: \n",
    "            self.counter += 1 # 计数器加1，下面的patience判断用到\n",
    "            \n",
    "    @property  # 使用@property装饰器，使得方法变成属性，使得对象.early_stop可以调用，无需加()\n",
    "    def early_stop(self):\n",
    "        return self.counter >= self.patience\n"
   ],
   "outputs": [],
   "execution_count": 9
  },
  {
   "cell_type": "code",
   "source": [
    "500*32*5"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-01-25T08:29:24.152036Z",
     "start_time": "2025-01-25T08:29:24.148178Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "80000"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 10
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-25T08:29:24.721503Z",
     "start_time": "2025-01-25T08:29:24.715150Z"
    }
   },
   "source": [
    "# 训练\n",
    "def training(\n",
    "    model, \n",
    "    train_loader, \n",
    "    val_loader, \n",
    "    epoch, \n",
    "    loss_fct, \n",
    "    optimizer, \n",
    "    tensorboard_callback=None,\n",
    "    save_ckpt_callback=None,\n",
    "    early_stop_callback=None,\n",
    "    eval_step=500,\n",
    "    ):\n",
    "    record_dict = {\n",
    "        \"train\": [],\n",
    "        \"val\": []\n",
    "    }\n",
    "    \n",
    "    global_step = 0\n",
    "    model.train()\n",
    "    with tqdm(total=epoch * len(train_loader)) as pbar:\n",
    "        for epoch_id in range(epoch):\n",
    "            # training\n",
    "            for datas, labels in train_loader:\n",
    "                datas = datas.to(device) # 数据放到device上\n",
    "                labels = labels.to(device) # 标签放到device上\n",
    "                # 梯度清空\n",
    "                optimizer.zero_grad()\n",
    "                # 模型前向计算\n",
    "                logits = model(datas)\n",
    "                # 计算损失\n",
    "                loss = loss_fct(logits, labels)\n",
    "                # 梯度回传，计算梯度，更新参数，这里是更新模型参数\n",
    "                loss.backward()\n",
    "                # 调整优化器，包括学习率的变动等\n",
    "                optimizer.step()\n",
    "                preds = logits.argmax(axis=-1)\n",
    "            \n",
    "                acc = accuracy_score(labels.cpu().numpy(), preds.cpu().numpy())    \n",
    "                loss = loss.cpu().item()\n",
    "                # record\n",
    "                \n",
    "                record_dict[\"train\"].append({\n",
    "                    \"loss\": loss, \"acc\": acc, \"step\": global_step\n",
    "                })\n",
    "                \n",
    "                # evaluating\n",
    "                if global_step % eval_step == 0:\n",
    "                    model.eval()  # 切换到验证集模式\n",
    "                    val_loss, val_acc = evaluating(model, val_loader, loss_fct)\n",
    "                    record_dict[\"val\"].append({\n",
    "                        \"loss\": val_loss, \"acc\": val_acc, \"step\": global_step\n",
    "                    })\n",
    "                    model.train() # 切换回训练集模式\n",
    "                    \n",
    "                    # 1. 使用 tensorboard 可视化\n",
    "                    if tensorboard_callback is not None:\n",
    "                        tensorboard_callback(\n",
    "                            global_step, # 37500\n",
    "                            loss=loss, val_loss=val_loss,\n",
    "                            acc=acc, val_acc=val_acc,\n",
    "                            lr=optimizer.param_groups[0][\"lr\"], # 取出当前学习率\n",
    "                            )\n",
    "                    \n",
    "                    # 2. 保存模型权重 save model checkpoint\n",
    "                    if save_ckpt_callback is not None:\n",
    "                        save_ckpt_callback(global_step, model.state_dict(), metric=val_acc) # 保存最好的模型，覆盖之前的模型，保存step，保存state_dict,通过metric(验证集准确率)判断是否保存最好的模型\n",
    "\n",
    "                    # 3. 早停 Early Stop\n",
    "                    if early_stop_callback is not None:\n",
    "                        early_stop_callback(val_acc) # 验证集准确率不再提升，则停止训练\n",
    "                        if early_stop_callback.early_stop:# 验证集准确率不再提升，则停止训练\n",
    "                            print(f\"Early stop at epoch {epoch_id} / global_step {global_step}\")\n",
    "                            return record_dict\n",
    "                    \n",
    "                # update step\n",
    "                global_step += 1\n",
    "                pbar.update(1)\n",
    "                pbar.set_postfix({\"epoch\": epoch_id})\n",
    "        \n",
    "    return record_dict"
   ],
   "outputs": [],
   "execution_count": 11
  },
  {
   "cell_type": "code",
   "source": [
    "epoch = 100\n",
    "\n",
    "model = NeuralNetwork()\n",
    "\n",
    "# 1. 定义损失函数 采用交叉熵损失\n",
    "loss_fct = nn.CrossEntropyLoss()\n",
    "# 2. 定义优化器 采用SGD\n",
    "optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9)\n",
    "\n",
    "# 1. tensorboard 可视化\n",
    "tensorboard_callback = TensorBoardCallback(\"runs\")\n",
    "tensorboard_callback.draw_model(model, [1, 28, 28])\n",
    "\n",
    "# 2. save best\n",
    "save_ckpt_callback = SaveCheckpointsCallback(\"checkpoints\", save_best_only=True)\n",
    "# 3. early stop\n",
    "early_stop_callback = EarlyStopCallback(patience=10)\n"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-01-25T08:29:56.208522Z",
     "start_time": "2025-01-25T08:29:56.115590Z"
    }
   },
   "outputs": [],
   "execution_count": 12
  },
  {
   "cell_type": "code",
   "source": [
    "list(model.parameters())[1] #可学习的模型参数"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-01-25T08:30:04.910481Z",
     "start_time": "2025-01-25T08:30:04.903681Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Parameter containing:\n",
       "tensor([-0.0132, -0.0043, -0.0344,  0.0033, -0.0336, -0.0161, -0.0293,  0.0285,\n",
       "        -0.0324, -0.0218, -0.0151, -0.0176, -0.0265,  0.0166, -0.0233,  0.0214,\n",
       "        -0.0294, -0.0095,  0.0145, -0.0158, -0.0290,  0.0050,  0.0123,  0.0034,\n",
       "         0.0202, -0.0003,  0.0224,  0.0344,  0.0083, -0.0126,  0.0257, -0.0096,\n",
       "        -0.0057, -0.0040, -0.0112, -0.0241,  0.0219,  0.0252,  0.0340,  0.0221,\n",
       "         0.0192,  0.0278, -0.0249, -0.0299,  0.0046,  0.0137, -0.0177,  0.0003,\n",
       "         0.0194, -0.0069,  0.0261,  0.0103,  0.0268, -0.0249, -0.0181, -0.0225,\n",
       "         0.0135, -0.0033, -0.0033,  0.0081, -0.0238, -0.0070, -0.0172,  0.0125,\n",
       "        -0.0176,  0.0206, -0.0050, -0.0259, -0.0311,  0.0321,  0.0021, -0.0324,\n",
       "         0.0346,  0.0083, -0.0313,  0.0016, -0.0263,  0.0105, -0.0075, -0.0304,\n",
       "        -0.0266,  0.0207,  0.0350, -0.0354,  0.0271, -0.0015, -0.0119,  0.0317,\n",
       "        -0.0318, -0.0162,  0.0061,  0.0237, -0.0344, -0.0298, -0.0234,  0.0338,\n",
       "        -0.0299,  0.0229, -0.0075,  0.0203,  0.0207,  0.0312,  0.0189,  0.0229,\n",
       "         0.0336, -0.0087, -0.0271,  0.0025,  0.0024,  0.0298, -0.0199,  0.0138,\n",
       "         0.0258, -0.0230,  0.0125, -0.0257, -0.0267, -0.0217,  0.0010,  0.0334,\n",
       "         0.0158, -0.0334, -0.0354,  0.0075, -0.0055, -0.0040,  0.0163,  0.0183,\n",
       "        -0.0322,  0.0025,  0.0177, -0.0122, -0.0244, -0.0072,  0.0028,  0.0076,\n",
       "        -0.0066, -0.0166,  0.0200,  0.0301,  0.0190, -0.0067, -0.0137, -0.0346,\n",
       "         0.0256, -0.0204,  0.0324,  0.0188, -0.0065,  0.0013, -0.0288,  0.0206,\n",
       "         0.0176,  0.0201, -0.0290, -0.0284,  0.0257, -0.0124, -0.0265,  0.0074,\n",
       "         0.0107,  0.0143,  0.0036, -0.0042, -0.0278, -0.0342, -0.0259, -0.0002,\n",
       "        -0.0013,  0.0078,  0.0041, -0.0339, -0.0324,  0.0156,  0.0133, -0.0038,\n",
       "         0.0020, -0.0086,  0.0084, -0.0319,  0.0165,  0.0312, -0.0065, -0.0280,\n",
       "         0.0316, -0.0057, -0.0027,  0.0156,  0.0351,  0.0199,  0.0121, -0.0019,\n",
       "        -0.0207, -0.0228,  0.0080, -0.0235,  0.0061,  0.0041, -0.0323, -0.0304,\n",
       "        -0.0020, -0.0257, -0.0013,  0.0152, -0.0047, -0.0171, -0.0233,  0.0052,\n",
       "        -0.0312,  0.0089, -0.0224, -0.0054, -0.0204, -0.0234,  0.0212, -0.0262,\n",
       "         0.0105,  0.0058,  0.0010,  0.0234, -0.0099, -0.0037, -0.0301,  0.0247,\n",
       "        -0.0156, -0.0300,  0.0206, -0.0038,  0.0035, -0.0122, -0.0336, -0.0044,\n",
       "         0.0065, -0.0239, -0.0202,  0.0327,  0.0128,  0.0258,  0.0181, -0.0030,\n",
       "         0.0189,  0.0172,  0.0011,  0.0157, -0.0281, -0.0284, -0.0305,  0.0086,\n",
       "        -0.0275, -0.0205, -0.0326, -0.0298,  0.0057, -0.0335, -0.0070,  0.0227,\n",
       "        -0.0353, -0.0312,  0.0244, -0.0151, -0.0323,  0.0034,  0.0059, -0.0056,\n",
       "        -0.0242, -0.0316,  0.0213, -0.0089, -0.0277,  0.0113,  0.0218, -0.0201,\n",
       "         0.0061,  0.0172, -0.0305,  0.0234, -0.0050,  0.0046, -0.0047,  0.0112,\n",
       "         0.0072, -0.0223, -0.0091,  0.0197, -0.0204,  0.0221,  0.0124,  0.0126,\n",
       "        -0.0268, -0.0203, -0.0167, -0.0192,  0.0075, -0.0353,  0.0338,  0.0337,\n",
       "        -0.0081, -0.0193,  0.0158, -0.0212], requires_grad=True)"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 13
  },
  {
   "cell_type": "code",
   "source": "model.state_dict().keys()  # 模型参数名字",
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-01-25T08:30:06.157623Z",
     "start_time": "2025-01-25T08:30:06.153726Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "odict_keys(['linear_relu_stack.0.weight', 'linear_relu_stack.0.bias', 'linear_relu_stack.2.weight', 'linear_relu_stack.2.bias', 'linear_relu_stack.4.weight', 'linear_relu_stack.4.bias'])"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 14
  },
  {
   "cell_type": "code",
   "source": [
    "model = model.to(device)  # 放到device上\n",
    "record = training(\n",
    "    model,\n",
    "    train_loader,\n",
    "    val_loader,\n",
    "    epoch,\n",
    "    loss_fct,\n",
    "    optimizer,\n",
    "    tensorboard_callback=tensorboard_callback,\n",
    "    save_ckpt_callback=save_ckpt_callback,\n",
    "    early_stop_callback=early_stop_callback,\n",
    "    eval_step=1000\n",
    "    )"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-01-25T08:33:08.760245Z",
     "start_time": "2025-01-25T08:30:08.129960Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "  0%|          | 0/187500 [00:00<?, ?it/s]"
      ],
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "bc3d3578759e4f65918f1fd9074d5f40"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Early stop at epoch 18 / global_step 34000\n"
     ]
    }
   ],
   "execution_count": 15
  },
  {
   "cell_type": "code",
   "source": [
    "# enumerate可以同时返回索引和值\n",
    "for i, item in enumerate([\"a\", \"b\", \"c\"]):\n",
    "    print(i, item)"
   ],
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 a\n",
      "1 b\n",
      "2 c\n"
     ]
    }
   ],
   "execution_count": 16
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-25T08:34:04.283272Z",
     "start_time": "2025-01-25T08:34:04.240943Z"
    }
   },
   "cell_type": "code",
   "source": "record",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'train': [{'loss': 2.2984161376953125, 'acc': 0.125, 'step': 0},\n",
       "  {'loss': 2.291072130203247, 'acc': 0.125, 'step': 1},\n",
       "  {'loss': 2.266981840133667, 'acc': 0.1875, 'step': 2},\n",
       "  {'loss': 2.2972145080566406, 'acc': 0.15625, 'step': 3},\n",
       "  {'loss': 2.3053460121154785, 'acc': 0.09375, 'step': 4},\n",
       "  {'loss': 2.295750379562378, 'acc': 0.1875, 'step': 5},\n",
       "  {'loss': 2.2866408824920654, 'acc': 0.125, 'step': 6},\n",
       "  {'loss': 2.2983856201171875, 'acc': 0.09375, 'step': 7},\n",
       "  {'loss': 2.2898480892181396, 'acc': 0.125, 'step': 8},\n",
       "  {'loss': 2.3170554637908936, 'acc': 0.0, 'step': 9},\n",
       "  {'loss': 2.3018219470977783, 'acc': 0.15625, 'step': 10},\n",
       "  {'loss': 2.295431137084961, 'acc': 0.09375, 'step': 11},\n",
       "  {'loss': 2.301356077194214, 'acc': 0.0625, 'step': 12},\n",
       "  {'loss': 2.2803754806518555, 'acc': 0.1875, 'step': 13},\n",
       "  {'loss': 2.279930591583252, 'acc': 0.125, 'step': 14},\n",
       "  {'loss': 2.298590898513794, 'acc': 0.0625, 'step': 15},\n",
       "  {'loss': 2.2805302143096924, 'acc': 0.125, 'step': 16},\n",
       "  {'loss': 2.296013832092285, 'acc': 0.03125, 'step': 17},\n",
       "  {'loss': 2.2730584144592285, 'acc': 0.0625, 'step': 18},\n",
       "  {'loss': 2.2935214042663574, 'acc': 0.03125, 'step': 19},\n",
       "  {'loss': 2.2838146686553955, 'acc': 0.15625, 'step': 20},\n",
       "  {'loss': 2.299325704574585, 'acc': 0.125, 'step': 21},\n",
       "  {'loss': 2.2817838191986084, 'acc': 0.03125, 'step': 22},\n",
       "  {'loss': 2.2985010147094727, 'acc': 0.09375, 'step': 23},\n",
       "  {'loss': 2.3005881309509277, 'acc': 0.0, 'step': 24},\n",
       "  {'loss': 2.2938895225524902, 'acc': 0.125, 'step': 25},\n",
       "  {'loss': 2.2754979133605957, 'acc': 0.0625, 'step': 26},\n",
       "  {'loss': 2.2793209552764893, 'acc': 0.0625, 'step': 27},\n",
       "  {'loss': 2.2774405479431152, 'acc': 0.09375, 'step': 28},\n",
       "  {'loss': 2.2573764324188232, 'acc': 0.1875, 'step': 29},\n",
       "  {'loss': 2.2681143283843994, 'acc': 0.15625, 'step': 30},\n",
       "  {'loss': 2.254582405090332, 'acc': 0.15625, 'step': 31},\n",
       "  {'loss': 2.27339506149292, 'acc': 0.125, 'step': 32},\n",
       "  {'loss': 2.260274648666382, 'acc': 0.125, 'step': 33},\n",
       "  {'loss': 2.2666397094726562, 'acc': 0.03125, 'step': 34},\n",
       "  {'loss': 2.2811226844787598, 'acc': 0.0625, 'step': 35},\n",
       "  {'loss': 2.2512991428375244, 'acc': 0.1875, 'step': 36},\n",
       "  {'loss': 2.2343175411224365, 'acc': 0.15625, 'step': 37},\n",
       "  {'loss': 2.284698009490967, 'acc': 0.03125, 'step': 38},\n",
       "  {'loss': 2.285701274871826, 'acc': 0.0, 'step': 39},\n",
       "  {'loss': 2.2716710567474365, 'acc': 0.0625, 'step': 40},\n",
       "  {'loss': 2.271589756011963, 'acc': 0.0625, 'step': 41},\n",
       "  {'loss': 2.261644124984741, 'acc': 0.125, 'step': 42},\n",
       "  {'loss': 2.2610092163085938, 'acc': 0.15625, 'step': 43},\n",
       "  {'loss': 2.2695796489715576, 'acc': 0.125, 'step': 44},\n",
       "  {'loss': 2.238572835922241, 'acc': 0.125, 'step': 45},\n",
       "  {'loss': 2.2717833518981934, 'acc': 0.03125, 'step': 46},\n",
       "  {'loss': 2.2648379802703857, 'acc': 0.09375, 'step': 47},\n",
       "  {'loss': 2.248487949371338, 'acc': 0.09375, 'step': 48},\n",
       "  {'loss': 2.2583134174346924, 'acc': 0.0625, 'step': 49},\n",
       "  {'loss': 2.2628705501556396, 'acc': 0.03125, 'step': 50},\n",
       "  {'loss': 2.233531951904297, 'acc': 0.09375, 'step': 51},\n",
       "  {'loss': 2.2590622901916504, 'acc': 0.0625, 'step': 52},\n",
       "  {'loss': 2.2495319843292236, 'acc': 0.0625, 'step': 53},\n",
       "  {'loss': 2.214782476425171, 'acc': 0.25, 'step': 54},\n",
       "  {'loss': 2.245931386947632, 'acc': 0.09375, 'step': 55},\n",
       "  {'loss': 2.2570548057556152, 'acc': 0.03125, 'step': 56},\n",
       "  {'loss': 2.24043607711792, 'acc': 0.0625, 'step': 57},\n",
       "  {'loss': 2.2246856689453125, 'acc': 0.15625, 'step': 58},\n",
       "  {'loss': 2.239487648010254, 'acc': 0.09375, 'step': 59},\n",
       "  {'loss': 2.245070457458496, 'acc': 0.125, 'step': 60},\n",
       "  {'loss': 2.2430083751678467, 'acc': 0.03125, 'step': 61},\n",
       "  {'loss': 2.248034715652466, 'acc': 0.125, 'step': 62},\n",
       "  {'loss': 2.2490077018737793, 'acc': 0.09375, 'step': 63},\n",
       "  {'loss': 2.2217652797698975, 'acc': 0.1875, 'step': 64},\n",
       "  {'loss': 2.2473995685577393, 'acc': 0.09375, 'step': 65},\n",
       "  {'loss': 2.2324726581573486, 'acc': 0.15625, 'step': 66},\n",
       "  {'loss': 2.2368438243865967, 'acc': 0.09375, 'step': 67},\n",
       "  {'loss': 2.228869676589966, 'acc': 0.1875, 'step': 68},\n",
       "  {'loss': 2.2463219165802, 'acc': 0.0625, 'step': 69},\n",
       "  {'loss': 2.234617233276367, 'acc': 0.09375, 'step': 70},\n",
       "  {'loss': 2.2157490253448486, 'acc': 0.0625, 'step': 71},\n",
       "  {'loss': 2.239853620529175, 'acc': 0.0625, 'step': 72},\n",
       "  {'loss': 2.250779867172241, 'acc': 0.0, 'step': 73},\n",
       "  {'loss': 2.2375707626342773, 'acc': 0.0625, 'step': 74},\n",
       "  {'loss': 2.2222461700439453, 'acc': 0.1875, 'step': 75},\n",
       "  {'loss': 2.235051393508911, 'acc': 0.0625, 'step': 76},\n",
       "  {'loss': 2.2640933990478516, 'acc': 0.03125, 'step': 77},\n",
       "  {'loss': 2.2348995208740234, 'acc': 0.15625, 'step': 78},\n",
       "  {'loss': 2.196298360824585, 'acc': 0.21875, 'step': 79},\n",
       "  {'loss': 2.2213852405548096, 'acc': 0.125, 'step': 80},\n",
       "  {'loss': 2.2330472469329834, 'acc': 0.09375, 'step': 81},\n",
       "  {'loss': 2.2259156703948975, 'acc': 0.03125, 'step': 82},\n",
       "  {'loss': 2.2203660011291504, 'acc': 0.09375, 'step': 83},\n",
       "  {'loss': 2.222503185272217, 'acc': 0.1875, 'step': 84},\n",
       "  {'loss': 2.2159783840179443, 'acc': 0.21875, 'step': 85},\n",
       "  {'loss': 2.217820405960083, 'acc': 0.15625, 'step': 86},\n",
       "  {'loss': 2.2324647903442383, 'acc': 0.125, 'step': 87},\n",
       "  {'loss': 2.2126543521881104, 'acc': 0.125, 'step': 88},\n",
       "  {'loss': 2.175774097442627, 'acc': 0.21875, 'step': 89},\n",
       "  {'loss': 2.2207720279693604, 'acc': 0.125, 'step': 90},\n",
       "  {'loss': 2.1991329193115234, 'acc': 0.125, 'step': 91},\n",
       "  {'loss': 2.2048652172088623, 'acc': 0.15625, 'step': 92},\n",
       "  {'loss': 2.224414110183716, 'acc': 0.125, 'step': 93},\n",
       "  {'loss': 2.193913698196411, 'acc': 0.1875, 'step': 94},\n",
       "  {'loss': 2.1825902462005615, 'acc': 0.28125, 'step': 95},\n",
       "  {'loss': 2.2258081436157227, 'acc': 0.15625, 'step': 96},\n",
       "  {'loss': 2.2095274925231934, 'acc': 0.15625, 'step': 97},\n",
       "  {'loss': 2.1870877742767334, 'acc': 0.1875, 'step': 98},\n",
       "  {'loss': 2.190688371658325, 'acc': 0.1875, 'step': 99},\n",
       "  {'loss': 2.1941120624542236, 'acc': 0.1875, 'step': 100},\n",
       "  {'loss': 2.198549270629883, 'acc': 0.15625, 'step': 101},\n",
       "  {'loss': 2.202507257461548, 'acc': 0.09375, 'step': 102},\n",
       "  {'loss': 2.1899757385253906, 'acc': 0.1875, 'step': 103},\n",
       "  {'loss': 2.2145655155181885, 'acc': 0.0625, 'step': 104},\n",
       "  {'loss': 2.2141504287719727, 'acc': 0.09375, 'step': 105},\n",
       "  {'loss': 2.203317403793335, 'acc': 0.15625, 'step': 106},\n",
       "  {'loss': 2.194986581802368, 'acc': 0.15625, 'step': 107},\n",
       "  {'loss': 2.1905033588409424, 'acc': 0.25, 'step': 108},\n",
       "  {'loss': 2.2070744037628174, 'acc': 0.25, 'step': 109},\n",
       "  {'loss': 2.214688777923584, 'acc': 0.1875, 'step': 110},\n",
       "  {'loss': 2.16738224029541, 'acc': 0.28125, 'step': 111},\n",
       "  {'loss': 2.1677935123443604, 'acc': 0.375, 'step': 112},\n",
       "  {'loss': 2.1884407997131348, 'acc': 0.09375, 'step': 113},\n",
       "  {'loss': 2.163308620452881, 'acc': 0.28125, 'step': 114},\n",
       "  {'loss': 2.218306064605713, 'acc': 0.125, 'step': 115},\n",
       "  {'loss': 2.1940791606903076, 'acc': 0.28125, 'step': 116},\n",
       "  {'loss': 2.1450932025909424, 'acc': 0.40625, 'step': 117},\n",
       "  {'loss': 2.177232503890991, 'acc': 0.21875, 'step': 118},\n",
       "  {'loss': 2.19154691696167, 'acc': 0.125, 'step': 119},\n",
       "  {'loss': 2.1613776683807373, 'acc': 0.3125, 'step': 120},\n",
       "  {'loss': 2.181840658187866, 'acc': 0.15625, 'step': 121},\n",
       "  {'loss': 2.1533617973327637, 'acc': 0.375, 'step': 122},\n",
       "  {'loss': 2.143930673599243, 'acc': 0.34375, 'step': 123},\n",
       "  {'loss': 2.159514904022217, 'acc': 0.375, 'step': 124},\n",
       "  {'loss': 2.1819725036621094, 'acc': 0.21875, 'step': 125},\n",
       "  {'loss': 2.1404776573181152, 'acc': 0.40625, 'step': 126},\n",
       "  {'loss': 2.20434832572937, 'acc': 0.25, 'step': 127},\n",
       "  {'loss': 2.182730197906494, 'acc': 0.28125, 'step': 128},\n",
       "  {'loss': 2.151475667953491, 'acc': 0.3125, 'step': 129},\n",
       "  {'loss': 2.1619513034820557, 'acc': 0.28125, 'step': 130},\n",
       "  {'loss': 2.1484103202819824, 'acc': 0.3125, 'step': 131},\n",
       "  {'loss': 2.1587603092193604, 'acc': 0.34375, 'step': 132},\n",
       "  {'loss': 2.171755075454712, 'acc': 0.34375, 'step': 133},\n",
       "  {'loss': 2.159916400909424, 'acc': 0.375, 'step': 134},\n",
       "  {'loss': 2.1520724296569824, 'acc': 0.28125, 'step': 135},\n",
       "  {'loss': 2.0868284702301025, 'acc': 0.53125, 'step': 136},\n",
       "  {'loss': 2.1563470363616943, 'acc': 0.25, 'step': 137},\n",
       "  {'loss': 2.141005039215088, 'acc': 0.3125, 'step': 138},\n",
       "  {'loss': 2.1620731353759766, 'acc': 0.25, 'step': 139},\n",
       "  {'loss': 2.154689073562622, 'acc': 0.25, 'step': 140},\n",
       "  {'loss': 2.158320426940918, 'acc': 0.21875, 'step': 141},\n",
       "  {'loss': 2.1188719272613525, 'acc': 0.3125, 'step': 142},\n",
       "  {'loss': 2.1441218852996826, 'acc': 0.25, 'step': 143},\n",
       "  {'loss': 2.132582187652588, 'acc': 0.34375, 'step': 144},\n",
       "  {'loss': 2.1823692321777344, 'acc': 0.25, 'step': 145},\n",
       "  {'loss': 2.139854669570923, 'acc': 0.3125, 'step': 146},\n",
       "  {'loss': 2.146881341934204, 'acc': 0.34375, 'step': 147},\n",
       "  {'loss': 2.1503188610076904, 'acc': 0.3125, 'step': 148},\n",
       "  {'loss': 2.132830858230591, 'acc': 0.28125, 'step': 149},\n",
       "  {'loss': 2.132559299468994, 'acc': 0.28125, 'step': 150},\n",
       "  {'loss': 2.1442182064056396, 'acc': 0.21875, 'step': 151},\n",
       "  {'loss': 2.1228301525115967, 'acc': 0.4375, 'step': 152},\n",
       "  {'loss': 2.077644109725952, 'acc': 0.34375, 'step': 153},\n",
       "  {'loss': 2.1095662117004395, 'acc': 0.34375, 'step': 154},\n",
       "  {'loss': 2.1081974506378174, 'acc': 0.34375, 'step': 155},\n",
       "  {'loss': 2.104172945022583, 'acc': 0.40625, 'step': 156},\n",
       "  {'loss': 2.0944933891296387, 'acc': 0.40625, 'step': 157},\n",
       "  {'loss': 2.124054431915283, 'acc': 0.3125, 'step': 158},\n",
       "  {'loss': 2.06790828704834, 'acc': 0.4375, 'step': 159},\n",
       "  {'loss': 2.1313228607177734, 'acc': 0.21875, 'step': 160},\n",
       "  {'loss': 2.135801076889038, 'acc': 0.25, 'step': 161},\n",
       "  {'loss': 2.12412428855896, 'acc': 0.28125, 'step': 162},\n",
       "  {'loss': 2.0951106548309326, 'acc': 0.34375, 'step': 163},\n",
       "  {'loss': 2.073801040649414, 'acc': 0.40625, 'step': 164},\n",
       "  {'loss': 2.14802885055542, 'acc': 0.25, 'step': 165},\n",
       "  {'loss': 2.1084275245666504, 'acc': 0.34375, 'step': 166},\n",
       "  {'loss': 2.1117143630981445, 'acc': 0.28125, 'step': 167},\n",
       "  {'loss': 2.0884740352630615, 'acc': 0.40625, 'step': 168},\n",
       "  {'loss': 2.066894769668579, 'acc': 0.40625, 'step': 169},\n",
       "  {'loss': 2.07804274559021, 'acc': 0.3125, 'step': 170},\n",
       "  {'loss': 2.0220348834991455, 'acc': 0.53125, 'step': 171},\n",
       "  {'loss': 2.1221771240234375, 'acc': 0.375, 'step': 172},\n",
       "  {'loss': 2.120222568511963, 'acc': 0.1875, 'step': 173},\n",
       "  {'loss': 2.1038544178009033, 'acc': 0.25, 'step': 174},\n",
       "  {'loss': 2.0812761783599854, 'acc': 0.375, 'step': 175},\n",
       "  {'loss': 2.081859588623047, 'acc': 0.34375, 'step': 176},\n",
       "  {'loss': 2.050584077835083, 'acc': 0.4375, 'step': 177},\n",
       "  {'loss': 2.0916874408721924, 'acc': 0.28125, 'step': 178},\n",
       "  {'loss': 2.1172173023223877, 'acc': 0.21875, 'step': 179},\n",
       "  {'loss': 2.06584095954895, 'acc': 0.375, 'step': 180},\n",
       "  {'loss': 2.0773346424102783, 'acc': 0.28125, 'step': 181},\n",
       "  {'loss': 2.0609636306762695, 'acc': 0.25, 'step': 182},\n",
       "  {'loss': 2.021028518676758, 'acc': 0.34375, 'step': 183},\n",
       "  {'loss': 2.0644450187683105, 'acc': 0.3125, 'step': 184},\n",
       "  {'loss': 2.0661888122558594, 'acc': 0.3125, 'step': 185},\n",
       "  {'loss': 2.058391571044922, 'acc': 0.34375, 'step': 186},\n",
       "  {'loss': 2.02793550491333, 'acc': 0.3125, 'step': 187},\n",
       "  {'loss': 2.0583558082580566, 'acc': 0.34375, 'step': 188},\n",
       "  {'loss': 2.039194107055664, 'acc': 0.375, 'step': 189},\n",
       "  {'loss': 2.000183343887329, 'acc': 0.46875, 'step': 190},\n",
       "  {'loss': 2.0215632915496826, 'acc': 0.34375, 'step': 191},\n",
       "  {'loss': 2.0674915313720703, 'acc': 0.3125, 'step': 192},\n",
       "  {'loss': 1.9865630865097046, 'acc': 0.46875, 'step': 193},\n",
       "  {'loss': 2.0203964710235596, 'acc': 0.4375, 'step': 194},\n",
       "  {'loss': 2.0532453060150146, 'acc': 0.25, 'step': 195},\n",
       "  {'loss': 2.0171024799346924, 'acc': 0.40625, 'step': 196},\n",
       "  {'loss': 2.020329236984253, 'acc': 0.40625, 'step': 197},\n",
       "  {'loss': 2.059654474258423, 'acc': 0.34375, 'step': 198},\n",
       "  {'loss': 1.9924933910369873, 'acc': 0.4375, 'step': 199},\n",
       "  {'loss': 2.0071229934692383, 'acc': 0.40625, 'step': 200},\n",
       "  {'loss': 2.040487051010132, 'acc': 0.25, 'step': 201},\n",
       "  {'loss': 1.9975647926330566, 'acc': 0.5, 'step': 202},\n",
       "  {'loss': 2.02299165725708, 'acc': 0.375, 'step': 203},\n",
       "  {'loss': 1.9783262014389038, 'acc': 0.375, 'step': 204},\n",
       "  {'loss': 2.093475103378296, 'acc': 0.28125, 'step': 205},\n",
       "  {'loss': 1.9928663969039917, 'acc': 0.375, 'step': 206},\n",
       "  {'loss': 2.0240373611450195, 'acc': 0.4375, 'step': 207},\n",
       "  {'loss': 1.9294633865356445, 'acc': 0.46875, 'step': 208},\n",
       "  {'loss': 1.941692590713501, 'acc': 0.53125, 'step': 209},\n",
       "  {'loss': 1.9718151092529297, 'acc': 0.46875, 'step': 210},\n",
       "  {'loss': 1.9682235717773438, 'acc': 0.40625, 'step': 211},\n",
       "  {'loss': 2.03944730758667, 'acc': 0.125, 'step': 212},\n",
       "  {'loss': 1.998864769935608, 'acc': 0.40625, 'step': 213},\n",
       "  {'loss': 1.9603933095932007, 'acc': 0.375, 'step': 214},\n",
       "  {'loss': 1.9120585918426514, 'acc': 0.625, 'step': 215},\n",
       "  {'loss': 1.9872468709945679, 'acc': 0.375, 'step': 216},\n",
       "  {'loss': 1.9554200172424316, 'acc': 0.375, 'step': 217},\n",
       "  {'loss': 1.9241588115692139, 'acc': 0.4375, 'step': 218},\n",
       "  {'loss': 1.9764949083328247, 'acc': 0.28125, 'step': 219},\n",
       "  {'loss': 2.016528844833374, 'acc': 0.375, 'step': 220},\n",
       "  {'loss': 2.017191171646118, 'acc': 0.28125, 'step': 221},\n",
       "  {'loss': 1.9008536338806152, 'acc': 0.5625, 'step': 222},\n",
       "  {'loss': 1.9947845935821533, 'acc': 0.34375, 'step': 223},\n",
       "  {'loss': 1.9450342655181885, 'acc': 0.375, 'step': 224},\n",
       "  {'loss': 1.92572820186615, 'acc': 0.34375, 'step': 225},\n",
       "  {'loss': 1.867594838142395, 'acc': 0.46875, 'step': 226},\n",
       "  {'loss': 1.961166262626648, 'acc': 0.5, 'step': 227},\n",
       "  {'loss': 1.9009393453598022, 'acc': 0.46875, 'step': 228},\n",
       "  {'loss': 1.9693753719329834, 'acc': 0.34375, 'step': 229},\n",
       "  {'loss': 1.94191575050354, 'acc': 0.375, 'step': 230},\n",
       "  {'loss': 1.93473219871521, 'acc': 0.375, 'step': 231},\n",
       "  {'loss': 1.9250462055206299, 'acc': 0.40625, 'step': 232},\n",
       "  {'loss': 1.96250319480896, 'acc': 0.21875, 'step': 233},\n",
       "  {'loss': 1.9799219369888306, 'acc': 0.28125, 'step': 234},\n",
       "  {'loss': 1.9778110980987549, 'acc': 0.25, 'step': 235},\n",
       "  {'loss': 1.9273872375488281, 'acc': 0.34375, 'step': 236},\n",
       "  {'loss': 1.885939598083496, 'acc': 0.40625, 'step': 237},\n",
       "  {'loss': 1.9086540937423706, 'acc': 0.3125, 'step': 238},\n",
       "  {'loss': 1.936971664428711, 'acc': 0.34375, 'step': 239},\n",
       "  {'loss': 1.8638405799865723, 'acc': 0.4375, 'step': 240},\n",
       "  {'loss': 1.8939841985702515, 'acc': 0.5, 'step': 241},\n",
       "  {'loss': 1.9712492227554321, 'acc': 0.3125, 'step': 242},\n",
       "  {'loss': 1.9547803401947021, 'acc': 0.34375, 'step': 243},\n",
       "  {'loss': 1.936920404434204, 'acc': 0.25, 'step': 244},\n",
       "  {'loss': 1.8487628698349, 'acc': 0.375, 'step': 245},\n",
       "  {'loss': 1.9168261289596558, 'acc': 0.40625, 'step': 246},\n",
       "  {'loss': 1.9475252628326416, 'acc': 0.34375, 'step': 247},\n",
       "  {'loss': 1.9465539455413818, 'acc': 0.375, 'step': 248},\n",
       "  {'loss': 1.934946060180664, 'acc': 0.40625, 'step': 249},\n",
       "  {'loss': 1.8346989154815674, 'acc': 0.375, 'step': 250},\n",
       "  {'loss': 1.8853936195373535, 'acc': 0.34375, 'step': 251},\n",
       "  {'loss': 1.9070931673049927, 'acc': 0.375, 'step': 252},\n",
       "  {'loss': 1.8660293817520142, 'acc': 0.4375, 'step': 253},\n",
       "  {'loss': 1.8731071949005127, 'acc': 0.40625, 'step': 254},\n",
       "  {'loss': 1.8291984796524048, 'acc': 0.5, 'step': 255},\n",
       "  {'loss': 1.873928427696228, 'acc': 0.4375, 'step': 256},\n",
       "  {'loss': 1.8759112358093262, 'acc': 0.34375, 'step': 257},\n",
       "  {'loss': 1.8820202350616455, 'acc': 0.3125, 'step': 258},\n",
       "  {'loss': 1.8203954696655273, 'acc': 0.40625, 'step': 259},\n",
       "  {'loss': 1.9016796350479126, 'acc': 0.375, 'step': 260},\n",
       "  {'loss': 1.7877838611602783, 'acc': 0.40625, 'step': 261},\n",
       "  {'loss': 1.8725098371505737, 'acc': 0.4375, 'step': 262},\n",
       "  {'loss': 1.8080722093582153, 'acc': 0.4375, 'step': 263},\n",
       "  {'loss': 1.8811804056167603, 'acc': 0.5, 'step': 264},\n",
       "  {'loss': 1.8065121173858643, 'acc': 0.5625, 'step': 265},\n",
       "  {'loss': 1.7805449962615967, 'acc': 0.53125, 'step': 266},\n",
       "  {'loss': 1.796509861946106, 'acc': 0.46875, 'step': 267},\n",
       "  {'loss': 1.8413463830947876, 'acc': 0.34375, 'step': 268},\n",
       "  {'loss': 1.8378608226776123, 'acc': 0.40625, 'step': 269},\n",
       "  {'loss': 1.7732750177383423, 'acc': 0.4375, 'step': 270},\n",
       "  {'loss': 1.7982701063156128, 'acc': 0.3125, 'step': 271},\n",
       "  {'loss': 1.6983410120010376, 'acc': 0.53125, 'step': 272},\n",
       "  {'loss': 1.81751549243927, 'acc': 0.46875, 'step': 273},\n",
       "  {'loss': 1.8309650421142578, 'acc': 0.4375, 'step': 274},\n",
       "  {'loss': 1.861185073852539, 'acc': 0.4375, 'step': 275},\n",
       "  {'loss': 1.8081707954406738, 'acc': 0.40625, 'step': 276},\n",
       "  {'loss': 1.783459186553955, 'acc': 0.34375, 'step': 277},\n",
       "  {'loss': 1.8242284059524536, 'acc': 0.25, 'step': 278},\n",
       "  {'loss': 1.7933014631271362, 'acc': 0.34375, 'step': 279},\n",
       "  {'loss': 1.7548011541366577, 'acc': 0.5, 'step': 280},\n",
       "  {'loss': 1.7537086009979248, 'acc': 0.5, 'step': 281},\n",
       "  {'loss': 1.7351731061935425, 'acc': 0.4375, 'step': 282},\n",
       "  {'loss': 1.748435378074646, 'acc': 0.5, 'step': 283},\n",
       "  {'loss': 1.8179117441177368, 'acc': 0.34375, 'step': 284},\n",
       "  {'loss': 1.8868181705474854, 'acc': 0.28125, 'step': 285},\n",
       "  {'loss': 1.7376302480697632, 'acc': 0.46875, 'step': 286},\n",
       "  {'loss': 1.7081831693649292, 'acc': 0.5, 'step': 287},\n",
       "  {'loss': 1.7976863384246826, 'acc': 0.40625, 'step': 288},\n",
       "  {'loss': 1.691393256187439, 'acc': 0.40625, 'step': 289},\n",
       "  {'loss': 1.7352862358093262, 'acc': 0.5, 'step': 290},\n",
       "  {'loss': 1.7366218566894531, 'acc': 0.46875, 'step': 291},\n",
       "  {'loss': 1.7728958129882812, 'acc': 0.46875, 'step': 292},\n",
       "  {'loss': 1.813782811164856, 'acc': 0.34375, 'step': 293},\n",
       "  {'loss': 1.651505947113037, 'acc': 0.4375, 'step': 294},\n",
       "  {'loss': 1.7777906656265259, 'acc': 0.40625, 'step': 295},\n",
       "  {'loss': 1.7418606281280518, 'acc': 0.46875, 'step': 296},\n",
       "  {'loss': 1.732721209526062, 'acc': 0.5, 'step': 297},\n",
       "  {'loss': 1.6985137462615967, 'acc': 0.40625, 'step': 298},\n",
       "  {'loss': 1.7458992004394531, 'acc': 0.3125, 'step': 299},\n",
       "  {'loss': 1.6836096048355103, 'acc': 0.59375, 'step': 300},\n",
       "  {'loss': 1.7319890260696411, 'acc': 0.4375, 'step': 301},\n",
       "  {'loss': 1.7312536239624023, 'acc': 0.3125, 'step': 302},\n",
       "  {'loss': 1.6970388889312744, 'acc': 0.40625, 'step': 303},\n",
       "  {'loss': 1.7782752513885498, 'acc': 0.25, 'step': 304},\n",
       "  {'loss': 1.6912071704864502, 'acc': 0.40625, 'step': 305},\n",
       "  {'loss': 1.59065580368042, 'acc': 0.53125, 'step': 306},\n",
       "  {'loss': 1.6935659646987915, 'acc': 0.4375, 'step': 307},\n",
       "  {'loss': 1.6564854383468628, 'acc': 0.53125, 'step': 308},\n",
       "  {'loss': 1.656110167503357, 'acc': 0.5, 'step': 309},\n",
       "  {'loss': 1.6176635026931763, 'acc': 0.4375, 'step': 310},\n",
       "  {'loss': 1.6869781017303467, 'acc': 0.375, 'step': 311},\n",
       "  {'loss': 1.6291313171386719, 'acc': 0.5625, 'step': 312},\n",
       "  {'loss': 1.692969799041748, 'acc': 0.4375, 'step': 313},\n",
       "  {'loss': 1.663591980934143, 'acc': 0.4375, 'step': 314},\n",
       "  {'loss': 1.6528059244155884, 'acc': 0.40625, 'step': 315},\n",
       "  {'loss': 1.6836389303207397, 'acc': 0.4375, 'step': 316},\n",
       "  {'loss': 1.6658570766448975, 'acc': 0.34375, 'step': 317},\n",
       "  {'loss': 1.7424731254577637, 'acc': 0.40625, 'step': 318},\n",
       "  {'loss': 1.8323220014572144, 'acc': 0.34375, 'step': 319},\n",
       "  {'loss': 1.6866716146469116, 'acc': 0.4375, 'step': 320},\n",
       "  {'loss': 1.6857601404190063, 'acc': 0.40625, 'step': 321},\n",
       "  {'loss': 1.4996753931045532, 'acc': 0.71875, 'step': 322},\n",
       "  {'loss': 1.7057387828826904, 'acc': 0.4375, 'step': 323},\n",
       "  {'loss': 1.6438668966293335, 'acc': 0.59375, 'step': 324},\n",
       "  {'loss': 1.539040207862854, 'acc': 0.5, 'step': 325},\n",
       "  {'loss': 1.6324957609176636, 'acc': 0.40625, 'step': 326},\n",
       "  {'loss': 1.5820335149765015, 'acc': 0.53125, 'step': 327},\n",
       "  {'loss': 1.6570758819580078, 'acc': 0.5, 'step': 328},\n",
       "  {'loss': 1.5975161790847778, 'acc': 0.5625, 'step': 329},\n",
       "  {'loss': 1.5492500066757202, 'acc': 0.59375, 'step': 330},\n",
       "  {'loss': 1.660474181175232, 'acc': 0.375, 'step': 331},\n",
       "  {'loss': 1.6646822690963745, 'acc': 0.53125, 'step': 332},\n",
       "  {'loss': 1.6119329929351807, 'acc': 0.46875, 'step': 333},\n",
       "  {'loss': 1.5208202600479126, 'acc': 0.625, 'step': 334},\n",
       "  {'loss': 1.6887340545654297, 'acc': 0.40625, 'step': 335},\n",
       "  {'loss': 1.4280823469161987, 'acc': 0.75, 'step': 336},\n",
       "  {'loss': 1.7269132137298584, 'acc': 0.375, 'step': 337},\n",
       "  {'loss': 1.5487220287322998, 'acc': 0.4375, 'step': 338},\n",
       "  {'loss': 1.6615362167358398, 'acc': 0.5, 'step': 339},\n",
       "  {'loss': 1.5534437894821167, 'acc': 0.5625, 'step': 340},\n",
       "  {'loss': 1.538513422012329, 'acc': 0.375, 'step': 341},\n",
       "  {'loss': 1.587569236755371, 'acc': 0.53125, 'step': 342},\n",
       "  {'loss': 1.6630196571350098, 'acc': 0.40625, 'step': 343},\n",
       "  {'loss': 1.4484937191009521, 'acc': 0.53125, 'step': 344},\n",
       "  {'loss': 1.52052640914917, 'acc': 0.46875, 'step': 345},\n",
       "  {'loss': 1.5418905019760132, 'acc': 0.625, 'step': 346},\n",
       "  {'loss': 1.547322154045105, 'acc': 0.53125, 'step': 347},\n",
       "  {'loss': 1.5345356464385986, 'acc': 0.59375, 'step': 348},\n",
       "  {'loss': 1.5581196546554565, 'acc': 0.5625, 'step': 349},\n",
       "  {'loss': 1.5683008432388306, 'acc': 0.53125, 'step': 350},\n",
       "  {'loss': 1.6047284603118896, 'acc': 0.53125, 'step': 351},\n",
       "  {'loss': 1.4690027236938477, 'acc': 0.59375, 'step': 352},\n",
       "  {'loss': 1.485067367553711, 'acc': 0.40625, 'step': 353},\n",
       "  {'loss': 1.552512288093567, 'acc': 0.4375, 'step': 354},\n",
       "  {'loss': 1.6016298532485962, 'acc': 0.40625, 'step': 355},\n",
       "  {'loss': 1.4832801818847656, 'acc': 0.53125, 'step': 356},\n",
       "  {'loss': 1.4982483386993408, 'acc': 0.5625, 'step': 357},\n",
       "  {'loss': 1.5699503421783447, 'acc': 0.4375, 'step': 358},\n",
       "  {'loss': 1.5076498985290527, 'acc': 0.5625, 'step': 359},\n",
       "  {'loss': 1.640528917312622, 'acc': 0.34375, 'step': 360},\n",
       "  {'loss': 1.405002474784851, 'acc': 0.46875, 'step': 361},\n",
       "  {'loss': 1.3185111284255981, 'acc': 0.78125, 'step': 362},\n",
       "  {'loss': 1.5479012727737427, 'acc': 0.625, 'step': 363},\n",
       "  {'loss': 1.5563697814941406, 'acc': 0.59375, 'step': 364},\n",
       "  {'loss': 1.4570385217666626, 'acc': 0.46875, 'step': 365},\n",
       "  {'loss': 1.536348819732666, 'acc': 0.59375, 'step': 366},\n",
       "  {'loss': 1.5496656894683838, 'acc': 0.5, 'step': 367},\n",
       "  {'loss': 1.417007565498352, 'acc': 0.65625, 'step': 368},\n",
       "  {'loss': 1.3526520729064941, 'acc': 0.75, 'step': 369},\n",
       "  {'loss': 1.5572459697723389, 'acc': 0.53125, 'step': 370},\n",
       "  {'loss': 1.4641776084899902, 'acc': 0.65625, 'step': 371},\n",
       "  {'loss': 1.3663086891174316, 'acc': 0.625, 'step': 372},\n",
       "  {'loss': 1.4368809461593628, 'acc': 0.5625, 'step': 373},\n",
       "  {'loss': 1.4997642040252686, 'acc': 0.53125, 'step': 374},\n",
       "  {'loss': 1.4788305759429932, 'acc': 0.59375, 'step': 375},\n",
       "  {'loss': 1.4966492652893066, 'acc': 0.53125, 'step': 376},\n",
       "  {'loss': 1.5550285577774048, 'acc': 0.5625, 'step': 377},\n",
       "  {'loss': 1.481110692024231, 'acc': 0.53125, 'step': 378},\n",
       "  {'loss': 1.4189502000808716, 'acc': 0.65625, 'step': 379},\n",
       "  {'loss': 1.3585377931594849, 'acc': 0.6875, 'step': 380},\n",
       "  {'loss': 1.4763600826263428, 'acc': 0.5625, 'step': 381},\n",
       "  {'loss': 1.3843393325805664, 'acc': 0.65625, 'step': 382},\n",
       "  {'loss': 1.3673914670944214, 'acc': 0.65625, 'step': 383},\n",
       "  {'loss': 1.4107491970062256, 'acc': 0.71875, 'step': 384},\n",
       "  {'loss': 1.344929575920105, 'acc': 0.5625, 'step': 385},\n",
       "  {'loss': 1.4278380870819092, 'acc': 0.625, 'step': 386},\n",
       "  {'loss': 1.458276629447937, 'acc': 0.5625, 'step': 387},\n",
       "  {'loss': 1.4326575994491577, 'acc': 0.78125, 'step': 388},\n",
       "  {'loss': 1.4531158208847046, 'acc': 0.625, 'step': 389},\n",
       "  {'loss': 1.3266112804412842, 'acc': 0.59375, 'step': 390},\n",
       "  {'loss': 1.4697800874710083, 'acc': 0.65625, 'step': 391},\n",
       "  {'loss': 1.2292582988739014, 'acc': 0.8125, 'step': 392},\n",
       "  {'loss': 1.418540120124817, 'acc': 0.71875, 'step': 393},\n",
       "  {'loss': 1.4530904293060303, 'acc': 0.625, 'step': 394},\n",
       "  {'loss': 1.3283288478851318, 'acc': 0.65625, 'step': 395},\n",
       "  {'loss': 1.5305213928222656, 'acc': 0.40625, 'step': 396},\n",
       "  {'loss': 1.2801486253738403, 'acc': 0.59375, 'step': 397},\n",
       "  {'loss': 1.503304123878479, 'acc': 0.4375, 'step': 398},\n",
       "  {'loss': 1.485789179801941, 'acc': 0.5, 'step': 399},\n",
       "  {'loss': 1.4778631925582886, 'acc': 0.46875, 'step': 400},\n",
       "  {'loss': 1.4014694690704346, 'acc': 0.5625, 'step': 401},\n",
       "  {'loss': 1.4632301330566406, 'acc': 0.4375, 'step': 402},\n",
       "  {'loss': 1.3682726621627808, 'acc': 0.5625, 'step': 403},\n",
       "  {'loss': 1.3585928678512573, 'acc': 0.59375, 'step': 404},\n",
       "  {'loss': 1.334930419921875, 'acc': 0.625, 'step': 405},\n",
       "  {'loss': 1.3815778493881226, 'acc': 0.65625, 'step': 406},\n",
       "  {'loss': 1.5008866786956787, 'acc': 0.625, 'step': 407},\n",
       "  {'loss': 1.3059321641921997, 'acc': 0.71875, 'step': 408},\n",
       "  {'loss': 1.325621485710144, 'acc': 0.5625, 'step': 409},\n",
       "  {'loss': 1.3660820722579956, 'acc': 0.625, 'step': 410},\n",
       "  {'loss': 1.3800991773605347, 'acc': 0.46875, 'step': 411},\n",
       "  {'loss': 1.4220116138458252, 'acc': 0.5625, 'step': 412},\n",
       "  {'loss': 1.3258378505706787, 'acc': 0.59375, 'step': 413},\n",
       "  {'loss': 1.1608264446258545, 'acc': 0.71875, 'step': 414},\n",
       "  {'loss': 1.3264793157577515, 'acc': 0.53125, 'step': 415},\n",
       "  {'loss': 1.3796926736831665, 'acc': 0.53125, 'step': 416},\n",
       "  {'loss': 1.3497576713562012, 'acc': 0.65625, 'step': 417},\n",
       "  {'loss': 1.3165093660354614, 'acc': 0.625, 'step': 418},\n",
       "  {'loss': 1.1791694164276123, 'acc': 0.65625, 'step': 419},\n",
       "  {'loss': 1.2421796321868896, 'acc': 0.78125, 'step': 420},\n",
       "  {'loss': 1.3579410314559937, 'acc': 0.59375, 'step': 421},\n",
       "  {'loss': 1.2231841087341309, 'acc': 0.84375, 'step': 422},\n",
       "  {'loss': 1.2847925424575806, 'acc': 0.625, 'step': 423},\n",
       "  {'loss': 1.1923880577087402, 'acc': 0.65625, 'step': 424},\n",
       "  {'loss': 1.1906436681747437, 'acc': 0.71875, 'step': 425},\n",
       "  {'loss': 1.3056517839431763, 'acc': 0.5625, 'step': 426},\n",
       "  {'loss': 1.4438964128494263, 'acc': 0.5625, 'step': 427},\n",
       "  {'loss': 1.4065965414047241, 'acc': 0.5625, 'step': 428},\n",
       "  {'loss': 1.3745907545089722, 'acc': 0.5, 'step': 429},\n",
       "  {'loss': 1.3950493335723877, 'acc': 0.59375, 'step': 430},\n",
       "  {'loss': 1.339545726776123, 'acc': 0.59375, 'step': 431},\n",
       "  {'loss': 1.2834151983261108, 'acc': 0.59375, 'step': 432},\n",
       "  {'loss': 1.3119462728500366, 'acc': 0.53125, 'step': 433},\n",
       "  {'loss': 1.5288814306259155, 'acc': 0.53125, 'step': 434},\n",
       "  {'loss': 1.2490849494934082, 'acc': 0.6875, 'step': 435},\n",
       "  {'loss': 1.2889831066131592, 'acc': 0.65625, 'step': 436},\n",
       "  {'loss': 1.4322609901428223, 'acc': 0.5625, 'step': 437},\n",
       "  {'loss': 1.2601537704467773, 'acc': 0.65625, 'step': 438},\n",
       "  {'loss': 1.2106122970581055, 'acc': 0.59375, 'step': 439},\n",
       "  {'loss': 1.1601440906524658, 'acc': 0.8125, 'step': 440},\n",
       "  {'loss': 1.3912956714630127, 'acc': 0.4375, 'step': 441},\n",
       "  {'loss': 1.2734354734420776, 'acc': 0.5625, 'step': 442},\n",
       "  {'loss': 1.2011644840240479, 'acc': 0.75, 'step': 443},\n",
       "  {'loss': 1.4245730638504028, 'acc': 0.53125, 'step': 444},\n",
       "  {'loss': 1.0633851289749146, 'acc': 0.78125, 'step': 445},\n",
       "  {'loss': 1.2321405410766602, 'acc': 0.65625, 'step': 446},\n",
       "  {'loss': 1.2631124258041382, 'acc': 0.625, 'step': 447},\n",
       "  {'loss': 1.316683053970337, 'acc': 0.625, 'step': 448},\n",
       "  {'loss': 1.1892547607421875, 'acc': 0.84375, 'step': 449},\n",
       "  {'loss': 1.1245911121368408, 'acc': 0.75, 'step': 450},\n",
       "  {'loss': 1.2938997745513916, 'acc': 0.59375, 'step': 451},\n",
       "  {'loss': 1.2763876914978027, 'acc': 0.65625, 'step': 452},\n",
       "  {'loss': 1.4354509115219116, 'acc': 0.5, 'step': 453},\n",
       "  {'loss': 1.2477927207946777, 'acc': 0.6875, 'step': 454},\n",
       "  {'loss': 1.3494762182235718, 'acc': 0.4375, 'step': 455},\n",
       "  {'loss': 1.349597692489624, 'acc': 0.5625, 'step': 456},\n",
       "  {'loss': 1.2011994123458862, 'acc': 0.5625, 'step': 457},\n",
       "  {'loss': 1.200371265411377, 'acc': 0.5625, 'step': 458},\n",
       "  {'loss': 1.0964806079864502, 'acc': 0.6875, 'step': 459},\n",
       "  {'loss': 1.3399137258529663, 'acc': 0.5, 'step': 460},\n",
       "  {'loss': 1.143548607826233, 'acc': 0.59375, 'step': 461},\n",
       "  {'loss': 1.3807003498077393, 'acc': 0.46875, 'step': 462},\n",
       "  {'loss': 1.358414888381958, 'acc': 0.625, 'step': 463},\n",
       "  {'loss': 1.1715431213378906, 'acc': 0.59375, 'step': 464},\n",
       "  {'loss': 1.2633901834487915, 'acc': 0.625, 'step': 465},\n",
       "  {'loss': 1.077246904373169, 'acc': 0.625, 'step': 466},\n",
       "  {'loss': 1.3223003149032593, 'acc': 0.59375, 'step': 467},\n",
       "  {'loss': 1.2332630157470703, 'acc': 0.59375, 'step': 468},\n",
       "  {'loss': 1.1748549938201904, 'acc': 0.625, 'step': 469},\n",
       "  {'loss': 1.2861725091934204, 'acc': 0.5625, 'step': 470},\n",
       "  {'loss': 1.2868560552597046, 'acc': 0.625, 'step': 471},\n",
       "  {'loss': 1.3767088651657104, 'acc': 0.5625, 'step': 472},\n",
       "  {'loss': 1.2068793773651123, 'acc': 0.65625, 'step': 473},\n",
       "  {'loss': 1.2142783403396606, 'acc': 0.59375, 'step': 474},\n",
       "  {'loss': 1.4013861417770386, 'acc': 0.4375, 'step': 475},\n",
       "  {'loss': 1.1530381441116333, 'acc': 0.71875, 'step': 476},\n",
       "  {'loss': 1.3070846796035767, 'acc': 0.4375, 'step': 477},\n",
       "  {'loss': 1.103195071220398, 'acc': 0.59375, 'step': 478},\n",
       "  {'loss': 1.16022527217865, 'acc': 0.71875, 'step': 479},\n",
       "  {'loss': 1.3165028095245361, 'acc': 0.46875, 'step': 480},\n",
       "  {'loss': 1.4146294593811035, 'acc': 0.40625, 'step': 481},\n",
       "  {'loss': 1.1613998413085938, 'acc': 0.59375, 'step': 482},\n",
       "  {'loss': 1.1441725492477417, 'acc': 0.5625, 'step': 483},\n",
       "  {'loss': 1.3416509628295898, 'acc': 0.46875, 'step': 484},\n",
       "  {'loss': 1.3863770961761475, 'acc': 0.5625, 'step': 485},\n",
       "  {'loss': 1.2803179025650024, 'acc': 0.5625, 'step': 486},\n",
       "  {'loss': 1.141274333000183, 'acc': 0.46875, 'step': 487},\n",
       "  {'loss': 1.3218759298324585, 'acc': 0.59375, 'step': 488},\n",
       "  {'loss': 1.0170680284500122, 'acc': 0.71875, 'step': 489},\n",
       "  {'loss': 1.1271933317184448, 'acc': 0.78125, 'step': 490},\n",
       "  {'loss': 1.1649830341339111, 'acc': 0.5625, 'step': 491},\n",
       "  {'loss': 1.444973111152649, 'acc': 0.4375, 'step': 492},\n",
       "  {'loss': 1.1783397197723389, 'acc': 0.625, 'step': 493},\n",
       "  {'loss': 1.0071450471878052, 'acc': 0.75, 'step': 494},\n",
       "  {'loss': 1.0164254903793335, 'acc': 0.78125, 'step': 495},\n",
       "  {'loss': 0.912591814994812, 'acc': 0.84375, 'step': 496},\n",
       "  {'loss': 1.1579630374908447, 'acc': 0.59375, 'step': 497},\n",
       "  {'loss': 1.2493971586227417, 'acc': 0.53125, 'step': 498},\n",
       "  {'loss': 1.1628423929214478, 'acc': 0.6875, 'step': 499},\n",
       "  {'loss': 1.1349753141403198, 'acc': 0.6875, 'step': 500},\n",
       "  {'loss': 1.1177880764007568, 'acc': 0.71875, 'step': 501},\n",
       "  {'loss': 1.2219808101654053, 'acc': 0.65625, 'step': 502},\n",
       "  {'loss': 1.1391535997390747, 'acc': 0.59375, 'step': 503},\n",
       "  {'loss': 1.0921711921691895, 'acc': 0.6875, 'step': 504},\n",
       "  {'loss': 1.280011773109436, 'acc': 0.625, 'step': 505},\n",
       "  {'loss': 1.2722841501235962, 'acc': 0.53125, 'step': 506},\n",
       "  {'loss': 1.1467350721359253, 'acc': 0.5625, 'step': 507},\n",
       "  {'loss': 1.0898957252502441, 'acc': 0.71875, 'step': 508},\n",
       "  {'loss': 1.1949830055236816, 'acc': 0.6875, 'step': 509},\n",
       "  {'loss': 1.2694554328918457, 'acc': 0.53125, 'step': 510},\n",
       "  {'loss': 1.2873938083648682, 'acc': 0.53125, 'step': 511},\n",
       "  {'loss': 1.1984480619430542, 'acc': 0.6875, 'step': 512},\n",
       "  {'loss': 1.190814733505249, 'acc': 0.59375, 'step': 513},\n",
       "  {'loss': 1.2756866216659546, 'acc': 0.65625, 'step': 514},\n",
       "  {'loss': 1.0067943334579468, 'acc': 0.78125, 'step': 515},\n",
       "  {'loss': 1.1429632902145386, 'acc': 0.5625, 'step': 516},\n",
       "  {'loss': 1.293914556503296, 'acc': 0.53125, 'step': 517},\n",
       "  {'loss': 1.018644094467163, 'acc': 0.71875, 'step': 518},\n",
       "  {'loss': 1.245619297027588, 'acc': 0.53125, 'step': 519},\n",
       "  {'loss': 1.0599676370620728, 'acc': 0.75, 'step': 520},\n",
       "  {'loss': 1.2264374494552612, 'acc': 0.53125, 'step': 521},\n",
       "  {'loss': 1.0523890256881714, 'acc': 0.625, 'step': 522},\n",
       "  {'loss': 1.0444352626800537, 'acc': 0.59375, 'step': 523},\n",
       "  {'loss': 1.329670786857605, 'acc': 0.5, 'step': 524},\n",
       "  {'loss': 1.3116228580474854, 'acc': 0.46875, 'step': 525},\n",
       "  {'loss': 1.3563945293426514, 'acc': 0.53125, 'step': 526},\n",
       "  {'loss': 1.1194838285446167, 'acc': 0.6875, 'step': 527},\n",
       "  {'loss': 1.2523889541625977, 'acc': 0.4375, 'step': 528},\n",
       "  {'loss': 1.2148609161376953, 'acc': 0.5625, 'step': 529},\n",
       "  {'loss': 1.2169809341430664, 'acc': 0.625, 'step': 530},\n",
       "  {'loss': 1.338396668434143, 'acc': 0.5, 'step': 531},\n",
       "  {'loss': 1.1292567253112793, 'acc': 0.65625, 'step': 532},\n",
       "  {'loss': 1.0829213857650757, 'acc': 0.71875, 'step': 533},\n",
       "  {'loss': 0.9590029120445251, 'acc': 0.75, 'step': 534},\n",
       "  {'loss': 1.226351022720337, 'acc': 0.5, 'step': 535},\n",
       "  {'loss': 1.0784180164337158, 'acc': 0.59375, 'step': 536},\n",
       "  {'loss': 1.1403321027755737, 'acc': 0.625, 'step': 537},\n",
       "  {'loss': 1.3993850946426392, 'acc': 0.4375, 'step': 538},\n",
       "  {'loss': 1.2967495918273926, 'acc': 0.65625, 'step': 539},\n",
       "  {'loss': 1.3000922203063965, 'acc': 0.46875, 'step': 540},\n",
       "  {'loss': 1.2236145734786987, 'acc': 0.65625, 'step': 541},\n",
       "  {'loss': 1.1995567083358765, 'acc': 0.5, 'step': 542},\n",
       "  {'loss': 1.2298880815505981, 'acc': 0.625, 'step': 543},\n",
       "  {'loss': 1.251498818397522, 'acc': 0.53125, 'step': 544},\n",
       "  {'loss': 1.36016845703125, 'acc': 0.5625, 'step': 545},\n",
       "  {'loss': 1.3184911012649536, 'acc': 0.53125, 'step': 546},\n",
       "  {'loss': 1.1385080814361572, 'acc': 0.625, 'step': 547},\n",
       "  {'loss': 1.0365524291992188, 'acc': 0.6875, 'step': 548},\n",
       "  {'loss': 1.1637600660324097, 'acc': 0.59375, 'step': 549},\n",
       "  {'loss': 1.1775623559951782, 'acc': 0.65625, 'step': 550},\n",
       "  {'loss': 1.1556901931762695, 'acc': 0.65625, 'step': 551},\n",
       "  {'loss': 1.1758095026016235, 'acc': 0.59375, 'step': 552},\n",
       "  {'loss': 1.3432621955871582, 'acc': 0.40625, 'step': 553},\n",
       "  {'loss': 0.9886235594749451, 'acc': 0.71875, 'step': 554},\n",
       "  {'loss': 0.9700146317481995, 'acc': 0.75, 'step': 555},\n",
       "  {'loss': 1.1885722875595093, 'acc': 0.59375, 'step': 556},\n",
       "  {'loss': 1.0739338397979736, 'acc': 0.59375, 'step': 557},\n",
       "  {'loss': 1.0744293928146362, 'acc': 0.6875, 'step': 558},\n",
       "  {'loss': 1.2231231927871704, 'acc': 0.59375, 'step': 559},\n",
       "  {'loss': 1.1641323566436768, 'acc': 0.5625, 'step': 560},\n",
       "  {'loss': 1.1546815633773804, 'acc': 0.59375, 'step': 561},\n",
       "  {'loss': 1.2193334102630615, 'acc': 0.59375, 'step': 562},\n",
       "  {'loss': 1.021112084388733, 'acc': 0.6875, 'step': 563},\n",
       "  {'loss': 0.9968634247779846, 'acc': 0.625, 'step': 564},\n",
       "  {'loss': 1.097375512123108, 'acc': 0.59375, 'step': 565},\n",
       "  {'loss': 1.246199607849121, 'acc': 0.59375, 'step': 566},\n",
       "  {'loss': 1.1437097787857056, 'acc': 0.65625, 'step': 567},\n",
       "  {'loss': 1.1530771255493164, 'acc': 0.65625, 'step': 568},\n",
       "  {'loss': 1.1773567199707031, 'acc': 0.59375, 'step': 569},\n",
       "  {'loss': 1.261348009109497, 'acc': 0.5625, 'step': 570},\n",
       "  {'loss': 0.939117431640625, 'acc': 0.75, 'step': 571},\n",
       "  {'loss': 1.1583150625228882, 'acc': 0.625, 'step': 572},\n",
       "  {'loss': 1.117019772529602, 'acc': 0.53125, 'step': 573},\n",
       "  {'loss': 1.022078275680542, 'acc': 0.59375, 'step': 574},\n",
       "  {'loss': 1.175764799118042, 'acc': 0.5625, 'step': 575},\n",
       "  {'loss': 1.1540439128875732, 'acc': 0.5, 'step': 576},\n",
       "  {'loss': 1.141108751296997, 'acc': 0.59375, 'step': 577},\n",
       "  {'loss': 1.0046759843826294, 'acc': 0.65625, 'step': 578},\n",
       "  {'loss': 1.0079485177993774, 'acc': 0.6875, 'step': 579},\n",
       "  {'loss': 1.1176507472991943, 'acc': 0.5, 'step': 580},\n",
       "  {'loss': 1.0902694463729858, 'acc': 0.65625, 'step': 581},\n",
       "  {'loss': 1.2418149709701538, 'acc': 0.59375, 'step': 582},\n",
       "  {'loss': 1.2231680154800415, 'acc': 0.625, 'step': 583},\n",
       "  {'loss': 1.005807876586914, 'acc': 0.625, 'step': 584},\n",
       "  {'loss': 1.2378406524658203, 'acc': 0.59375, 'step': 585},\n",
       "  {'loss': 1.1723761558532715, 'acc': 0.5625, 'step': 586},\n",
       "  {'loss': 1.032259225845337, 'acc': 0.71875, 'step': 587},\n",
       "  {'loss': 0.919449508190155, 'acc': 0.78125, 'step': 588},\n",
       "  {'loss': 1.2339791059494019, 'acc': 0.4375, 'step': 589},\n",
       "  {'loss': 0.9430702924728394, 'acc': 0.78125, 'step': 590},\n",
       "  {'loss': 1.2391581535339355, 'acc': 0.5625, 'step': 591},\n",
       "  {'loss': 1.0582503080368042, 'acc': 0.59375, 'step': 592},\n",
       "  {'loss': 0.9970730543136597, 'acc': 0.6875, 'step': 593},\n",
       "  {'loss': 1.2858613729476929, 'acc': 0.53125, 'step': 594},\n",
       "  {'loss': 0.9884564876556396, 'acc': 0.71875, 'step': 595},\n",
       "  {'loss': 1.2245383262634277, 'acc': 0.59375, 'step': 596},\n",
       "  {'loss': 1.1359260082244873, 'acc': 0.625, 'step': 597},\n",
       "  {'loss': 1.0413259267807007, 'acc': 0.6875, 'step': 598},\n",
       "  {'loss': 0.9801377654075623, 'acc': 0.65625, 'step': 599},\n",
       "  {'loss': 1.2310177087783813, 'acc': 0.40625, 'step': 600},\n",
       "  {'loss': 1.1480940580368042, 'acc': 0.5625, 'step': 601},\n",
       "  {'loss': 1.0725598335266113, 'acc': 0.625, 'step': 602},\n",
       "  {'loss': 1.164139747619629, 'acc': 0.5625, 'step': 603},\n",
       "  {'loss': 1.192586898803711, 'acc': 0.46875, 'step': 604},\n",
       "  {'loss': 1.0364800691604614, 'acc': 0.6875, 'step': 605},\n",
       "  {'loss': 1.0259190797805786, 'acc': 0.65625, 'step': 606},\n",
       "  {'loss': 0.9934406876564026, 'acc': 0.65625, 'step': 607},\n",
       "  {'loss': 1.028881311416626, 'acc': 0.6875, 'step': 608},\n",
       "  {'loss': 0.9325844049453735, 'acc': 0.6875, 'step': 609},\n",
       "  {'loss': 1.0941052436828613, 'acc': 0.625, 'step': 610},\n",
       "  {'loss': 0.9513437747955322, 'acc': 0.625, 'step': 611},\n",
       "  {'loss': 1.1213067770004272, 'acc': 0.5625, 'step': 612},\n",
       "  {'loss': 0.9653283357620239, 'acc': 0.75, 'step': 613},\n",
       "  {'loss': 1.2106815576553345, 'acc': 0.53125, 'step': 614},\n",
       "  {'loss': 1.080195426940918, 'acc': 0.71875, 'step': 615},\n",
       "  {'loss': 1.0822969675064087, 'acc': 0.5625, 'step': 616},\n",
       "  {'loss': 1.0815086364746094, 'acc': 0.5, 'step': 617},\n",
       "  {'loss': 1.0630133152008057, 'acc': 0.53125, 'step': 618},\n",
       "  {'loss': 0.9818471074104309, 'acc': 0.65625, 'step': 619},\n",
       "  {'loss': 0.8407925963401794, 'acc': 0.8125, 'step': 620},\n",
       "  {'loss': 0.9970489740371704, 'acc': 0.65625, 'step': 621},\n",
       "  {'loss': 1.082486629486084, 'acc': 0.625, 'step': 622},\n",
       "  {'loss': 0.8546068668365479, 'acc': 0.6875, 'step': 623},\n",
       "  {'loss': 1.035650372505188, 'acc': 0.625, 'step': 624},\n",
       "  {'loss': 1.1602210998535156, 'acc': 0.59375, 'step': 625},\n",
       "  {'loss': 1.0039374828338623, 'acc': 0.65625, 'step': 626},\n",
       "  {'loss': 1.0373389720916748, 'acc': 0.625, 'step': 627},\n",
       "  {'loss': 0.9170134663581848, 'acc': 0.75, 'step': 628},\n",
       "  {'loss': 0.9696174263954163, 'acc': 0.65625, 'step': 629},\n",
       "  {'loss': 0.945690393447876, 'acc': 0.78125, 'step': 630},\n",
       "  {'loss': 0.9152990579605103, 'acc': 0.78125, 'step': 631},\n",
       "  {'loss': 1.0477509498596191, 'acc': 0.65625, 'step': 632},\n",
       "  {'loss': 1.0652021169662476, 'acc': 0.5625, 'step': 633},\n",
       "  {'loss': 1.0015543699264526, 'acc': 0.71875, 'step': 634},\n",
       "  {'loss': 0.9460163712501526, 'acc': 0.59375, 'step': 635},\n",
       "  {'loss': 1.0090279579162598, 'acc': 0.6875, 'step': 636},\n",
       "  {'loss': 1.0914226770401, 'acc': 0.59375, 'step': 637},\n",
       "  {'loss': 0.9730453491210938, 'acc': 0.625, 'step': 638},\n",
       "  {'loss': 1.148673176765442, 'acc': 0.5, 'step': 639},\n",
       "  {'loss': 0.867572546005249, 'acc': 0.71875, 'step': 640},\n",
       "  {'loss': 0.9657353758811951, 'acc': 0.75, 'step': 641},\n",
       "  {'loss': 1.154278039932251, 'acc': 0.46875, 'step': 642},\n",
       "  {'loss': 0.9584519863128662, 'acc': 0.625, 'step': 643},\n",
       "  {'loss': 0.9721683859825134, 'acc': 0.71875, 'step': 644},\n",
       "  {'loss': 0.8651219606399536, 'acc': 0.75, 'step': 645},\n",
       "  {'loss': 0.9066287279129028, 'acc': 0.71875, 'step': 646},\n",
       "  {'loss': 0.9344339966773987, 'acc': 0.71875, 'step': 647},\n",
       "  {'loss': 0.965024471282959, 'acc': 0.65625, 'step': 648},\n",
       "  {'loss': 1.012803077697754, 'acc': 0.625, 'step': 649},\n",
       "  {'loss': 1.1573761701583862, 'acc': 0.59375, 'step': 650},\n",
       "  {'loss': 1.110190749168396, 'acc': 0.4375, 'step': 651},\n",
       "  {'loss': 0.8792705535888672, 'acc': 0.65625, 'step': 652},\n",
       "  {'loss': 0.9903444051742554, 'acc': 0.625, 'step': 653},\n",
       "  {'loss': 0.953395664691925, 'acc': 0.65625, 'step': 654},\n",
       "  {'loss': 1.0768187046051025, 'acc': 0.625, 'step': 655},\n",
       "  {'loss': 0.7791213989257812, 'acc': 0.8125, 'step': 656},\n",
       "  {'loss': 0.9525108337402344, 'acc': 0.6875, 'step': 657},\n",
       "  {'loss': 1.0500233173370361, 'acc': 0.5, 'step': 658},\n",
       "  {'loss': 1.1786624193191528, 'acc': 0.53125, 'step': 659},\n",
       "  {'loss': 1.0846952199935913, 'acc': 0.625, 'step': 660},\n",
       "  {'loss': 1.3051197528839111, 'acc': 0.5625, 'step': 661},\n",
       "  {'loss': 1.1748169660568237, 'acc': 0.59375, 'step': 662},\n",
       "  {'loss': 0.8437855243682861, 'acc': 0.65625, 'step': 663},\n",
       "  {'loss': 0.8842349052429199, 'acc': 0.6875, 'step': 664},\n",
       "  {'loss': 0.9974845051765442, 'acc': 0.59375, 'step': 665},\n",
       "  {'loss': 0.9601994156837463, 'acc': 0.65625, 'step': 666},\n",
       "  {'loss': 0.9101735353469849, 'acc': 0.8125, 'step': 667},\n",
       "  {'loss': 1.0024365186691284, 'acc': 0.75, 'step': 668},\n",
       "  {'loss': 0.846096396446228, 'acc': 0.71875, 'step': 669},\n",
       "  {'loss': 1.0186129808425903, 'acc': 0.75, 'step': 670},\n",
       "  {'loss': 1.077252984046936, 'acc': 0.5625, 'step': 671},\n",
       "  {'loss': 0.7236805558204651, 'acc': 0.84375, 'step': 672},\n",
       "  {'loss': 1.0878649950027466, 'acc': 0.65625, 'step': 673},\n",
       "  {'loss': 1.1075555086135864, 'acc': 0.5625, 'step': 674},\n",
       "  {'loss': 0.9016783237457275, 'acc': 0.71875, 'step': 675},\n",
       "  {'loss': 1.076587200164795, 'acc': 0.625, 'step': 676},\n",
       "  {'loss': 1.0774486064910889, 'acc': 0.53125, 'step': 677},\n",
       "  {'loss': 1.0509836673736572, 'acc': 0.65625, 'step': 678},\n",
       "  {'loss': 1.1406761407852173, 'acc': 0.53125, 'step': 679},\n",
       "  {'loss': 0.873248815536499, 'acc': 0.6875, 'step': 680},\n",
       "  {'loss': 0.9648981690406799, 'acc': 0.5625, 'step': 681},\n",
       "  {'loss': 0.8443828821182251, 'acc': 0.75, 'step': 682},\n",
       "  {'loss': 1.015590786933899, 'acc': 0.59375, 'step': 683},\n",
       "  {'loss': 1.0749329328536987, 'acc': 0.46875, 'step': 684},\n",
       "  {'loss': 1.0847941637039185, 'acc': 0.625, 'step': 685},\n",
       "  {'loss': 0.9529061317443848, 'acc': 0.6875, 'step': 686},\n",
       "  {'loss': 0.8846378922462463, 'acc': 0.75, 'step': 687},\n",
       "  {'loss': 0.8228303790092468, 'acc': 0.75, 'step': 688},\n",
       "  {'loss': 0.9568427205085754, 'acc': 0.6875, 'step': 689},\n",
       "  {'loss': 0.9201216101646423, 'acc': 0.5625, 'step': 690},\n",
       "  {'loss': 1.1402409076690674, 'acc': 0.5625, 'step': 691},\n",
       "  {'loss': 0.9038749933242798, 'acc': 0.625, 'step': 692},\n",
       "  {'loss': 0.9154334664344788, 'acc': 0.59375, 'step': 693},\n",
       "  {'loss': 1.0611780881881714, 'acc': 0.59375, 'step': 694},\n",
       "  {'loss': 0.843477189540863, 'acc': 0.71875, 'step': 695},\n",
       "  {'loss': 1.1202470064163208, 'acc': 0.4375, 'step': 696},\n",
       "  {'loss': 0.9409879446029663, 'acc': 0.71875, 'step': 697},\n",
       "  {'loss': 1.0880725383758545, 'acc': 0.4375, 'step': 698},\n",
       "  {'loss': 0.8449186682701111, 'acc': 0.65625, 'step': 699},\n",
       "  {'loss': 0.9403180480003357, 'acc': 0.59375, 'step': 700},\n",
       "  {'loss': 0.8204582929611206, 'acc': 0.65625, 'step': 701},\n",
       "  {'loss': 0.9448962807655334, 'acc': 0.6875, 'step': 702},\n",
       "  {'loss': 1.103063702583313, 'acc': 0.59375, 'step': 703},\n",
       "  {'loss': 0.8065232038497925, 'acc': 0.65625, 'step': 704},\n",
       "  {'loss': 1.3169612884521484, 'acc': 0.53125, 'step': 705},\n",
       "  {'loss': 0.9317293167114258, 'acc': 0.625, 'step': 706},\n",
       "  {'loss': 1.180404782295227, 'acc': 0.53125, 'step': 707},\n",
       "  {'loss': 1.0272424221038818, 'acc': 0.5625, 'step': 708},\n",
       "  {'loss': 1.033039927482605, 'acc': 0.53125, 'step': 709},\n",
       "  {'loss': 0.9774408936500549, 'acc': 0.59375, 'step': 710},\n",
       "  {'loss': 0.872830867767334, 'acc': 0.75, 'step': 711},\n",
       "  {'loss': 0.7481249570846558, 'acc': 0.71875, 'step': 712},\n",
       "  {'loss': 0.8448745012283325, 'acc': 0.71875, 'step': 713},\n",
       "  {'loss': 1.036089301109314, 'acc': 0.65625, 'step': 714},\n",
       "  {'loss': 0.9289535284042358, 'acc': 0.71875, 'step': 715},\n",
       "  {'loss': 0.8278790712356567, 'acc': 0.75, 'step': 716},\n",
       "  {'loss': 0.8222308158874512, 'acc': 0.65625, 'step': 717},\n",
       "  {'loss': 1.0430995225906372, 'acc': 0.625, 'step': 718},\n",
       "  {'loss': 0.9495113492012024, 'acc': 0.6875, 'step': 719},\n",
       "  {'loss': 1.2923036813735962, 'acc': 0.59375, 'step': 720},\n",
       "  {'loss': 0.9803131818771362, 'acc': 0.625, 'step': 721},\n",
       "  {'loss': 1.0836570262908936, 'acc': 0.53125, 'step': 722},\n",
       "  {'loss': 1.085756778717041, 'acc': 0.625, 'step': 723},\n",
       "  {'loss': 1.1521741151809692, 'acc': 0.40625, 'step': 724},\n",
       "  {'loss': 1.0945701599121094, 'acc': 0.65625, 'step': 725},\n",
       "  {'loss': 0.8962819576263428, 'acc': 0.59375, 'step': 726},\n",
       "  {'loss': 1.111952543258667, 'acc': 0.53125, 'step': 727},\n",
       "  {'loss': 0.8542096018791199, 'acc': 0.78125, 'step': 728},\n",
       "  {'loss': 1.0169975757598877, 'acc': 0.59375, 'step': 729},\n",
       "  {'loss': 0.8887047171592712, 'acc': 0.6875, 'step': 730},\n",
       "  {'loss': 0.8252665996551514, 'acc': 0.65625, 'step': 731},\n",
       "  {'loss': 0.7870480418205261, 'acc': 0.78125, 'step': 732},\n",
       "  {'loss': 0.9648576974868774, 'acc': 0.625, 'step': 733},\n",
       "  {'loss': 0.8608428835868835, 'acc': 0.65625, 'step': 734},\n",
       "  {'loss': 0.9653285145759583, 'acc': 0.53125, 'step': 735},\n",
       "  {'loss': 0.977708101272583, 'acc': 0.75, 'step': 736},\n",
       "  {'loss': 1.1113723516464233, 'acc': 0.5625, 'step': 737},\n",
       "  {'loss': 0.9757601022720337, 'acc': 0.5625, 'step': 738},\n",
       "  {'loss': 1.0577141046524048, 'acc': 0.53125, 'step': 739},\n",
       "  {'loss': 1.0013031959533691, 'acc': 0.5625, 'step': 740},\n",
       "  {'loss': 0.8595914244651794, 'acc': 0.75, 'step': 741},\n",
       "  {'loss': 0.9310552477836609, 'acc': 0.71875, 'step': 742},\n",
       "  {'loss': 1.059889793395996, 'acc': 0.59375, 'step': 743},\n",
       "  {'loss': 0.8280141949653625, 'acc': 0.75, 'step': 744},\n",
       "  {'loss': 0.9365217685699463, 'acc': 0.625, 'step': 745},\n",
       "  {'loss': 0.9738883972167969, 'acc': 0.625, 'step': 746},\n",
       "  {'loss': 0.7778993248939514, 'acc': 0.75, 'step': 747},\n",
       "  {'loss': 0.9882509112358093, 'acc': 0.59375, 'step': 748},\n",
       "  {'loss': 0.8810522556304932, 'acc': 0.625, 'step': 749},\n",
       "  {'loss': 0.9130215644836426, 'acc': 0.65625, 'step': 750},\n",
       "  {'loss': 0.9801905155181885, 'acc': 0.5625, 'step': 751},\n",
       "  {'loss': 0.8922937512397766, 'acc': 0.65625, 'step': 752},\n",
       "  {'loss': 0.8843101859092712, 'acc': 0.71875, 'step': 753},\n",
       "  {'loss': 0.977912187576294, 'acc': 0.5625, 'step': 754},\n",
       "  {'loss': 0.891903817653656, 'acc': 0.65625, 'step': 755},\n",
       "  {'loss': 0.9420176148414612, 'acc': 0.65625, 'step': 756},\n",
       "  {'loss': 0.911899209022522, 'acc': 0.625, 'step': 757},\n",
       "  {'loss': 1.0364316701889038, 'acc': 0.46875, 'step': 758},\n",
       "  {'loss': 0.8962966203689575, 'acc': 0.6875, 'step': 759},\n",
       "  {'loss': 0.7855373620986938, 'acc': 0.75, 'step': 760},\n",
       "  {'loss': 0.8541210889816284, 'acc': 0.6875, 'step': 761},\n",
       "  {'loss': 1.0726081132888794, 'acc': 0.5625, 'step': 762},\n",
       "  {'loss': 0.8750141263008118, 'acc': 0.75, 'step': 763},\n",
       "  {'loss': 0.8441168665885925, 'acc': 0.71875, 'step': 764},\n",
       "  {'loss': 0.7982031106948853, 'acc': 0.78125, 'step': 765},\n",
       "  {'loss': 0.73479163646698, 'acc': 0.71875, 'step': 766},\n",
       "  {'loss': 0.736480712890625, 'acc': 0.6875, 'step': 767},\n",
       "  {'loss': 0.8545778393745422, 'acc': 0.6875, 'step': 768},\n",
       "  {'loss': 1.1497972011566162, 'acc': 0.53125, 'step': 769},\n",
       "  {'loss': 0.9902725219726562, 'acc': 0.59375, 'step': 770},\n",
       "  {'loss': 0.940586268901825, 'acc': 0.59375, 'step': 771},\n",
       "  {'loss': 0.9558994770050049, 'acc': 0.625, 'step': 772},\n",
       "  {'loss': 0.9841830134391785, 'acc': 0.59375, 'step': 773},\n",
       "  {'loss': 1.1508750915527344, 'acc': 0.65625, 'step': 774},\n",
       "  {'loss': 0.8271079659461975, 'acc': 0.75, 'step': 775},\n",
       "  {'loss': 0.9943946599960327, 'acc': 0.78125, 'step': 776},\n",
       "  {'loss': 0.8271304965019226, 'acc': 0.8125, 'step': 777},\n",
       "  {'loss': 1.034950613975525, 'acc': 0.5625, 'step': 778},\n",
       "  {'loss': 0.8011632561683655, 'acc': 0.6875, 'step': 779},\n",
       "  {'loss': 0.6855604648590088, 'acc': 0.75, 'step': 780},\n",
       "  {'loss': 0.8752978444099426, 'acc': 0.75, 'step': 781},\n",
       "  {'loss': 1.0163241624832153, 'acc': 0.625, 'step': 782},\n",
       "  {'loss': 0.8938144445419312, 'acc': 0.59375, 'step': 783},\n",
       "  {'loss': 0.9978196024894714, 'acc': 0.6875, 'step': 784},\n",
       "  {'loss': 0.7822060585021973, 'acc': 0.75, 'step': 785},\n",
       "  {'loss': 0.9959988594055176, 'acc': 0.5, 'step': 786},\n",
       "  {'loss': 0.9739845991134644, 'acc': 0.53125, 'step': 787},\n",
       "  {'loss': 0.9785687327384949, 'acc': 0.5, 'step': 788},\n",
       "  {'loss': 0.9328145384788513, 'acc': 0.59375, 'step': 789},\n",
       "  {'loss': 1.1799745559692383, 'acc': 0.53125, 'step': 790},\n",
       "  {'loss': 0.8068768978118896, 'acc': 0.59375, 'step': 791},\n",
       "  {'loss': 0.7016812562942505, 'acc': 0.75, 'step': 792},\n",
       "  {'loss': 0.8392059803009033, 'acc': 0.65625, 'step': 793},\n",
       "  {'loss': 0.9429640769958496, 'acc': 0.65625, 'step': 794},\n",
       "  {'loss': 0.8751813769340515, 'acc': 0.71875, 'step': 795},\n",
       "  {'loss': 0.998436689376831, 'acc': 0.5625, 'step': 796},\n",
       "  {'loss': 0.9050154685974121, 'acc': 0.6875, 'step': 797},\n",
       "  {'loss': 0.8322673439979553, 'acc': 0.6875, 'step': 798},\n",
       "  {'loss': 1.0437209606170654, 'acc': 0.5625, 'step': 799},\n",
       "  {'loss': 0.7955066561698914, 'acc': 0.625, 'step': 800},\n",
       "  {'loss': 0.8939530253410339, 'acc': 0.59375, 'step': 801},\n",
       "  {'loss': 1.044153094291687, 'acc': 0.59375, 'step': 802},\n",
       "  {'loss': 0.915961503982544, 'acc': 0.65625, 'step': 803},\n",
       "  {'loss': 1.0766589641571045, 'acc': 0.625, 'step': 804},\n",
       "  {'loss': 0.8684617280960083, 'acc': 0.8125, 'step': 805},\n",
       "  {'loss': 0.8044412136077881, 'acc': 0.78125, 'step': 806},\n",
       "  {'loss': 1.1470561027526855, 'acc': 0.46875, 'step': 807},\n",
       "  {'loss': 0.9355639219284058, 'acc': 0.59375, 'step': 808},\n",
       "  {'loss': 0.9825623631477356, 'acc': 0.59375, 'step': 809},\n",
       "  {'loss': 1.0661834478378296, 'acc': 0.65625, 'step': 810},\n",
       "  {'loss': 0.8323246240615845, 'acc': 0.65625, 'step': 811},\n",
       "  {'loss': 0.9243987798690796, 'acc': 0.5625, 'step': 812},\n",
       "  {'loss': 0.7692996859550476, 'acc': 0.75, 'step': 813},\n",
       "  {'loss': 1.0315132141113281, 'acc': 0.71875, 'step': 814},\n",
       "  {'loss': 0.7773730754852295, 'acc': 0.71875, 'step': 815},\n",
       "  {'loss': 1.0613927841186523, 'acc': 0.625, 'step': 816},\n",
       "  {'loss': 0.9991793036460876, 'acc': 0.71875, 'step': 817},\n",
       "  {'loss': 0.8339816331863403, 'acc': 0.71875, 'step': 818},\n",
       "  {'loss': 0.9021094441413879, 'acc': 0.65625, 'step': 819},\n",
       "  {'loss': 0.5940554738044739, 'acc': 0.84375, 'step': 820},\n",
       "  {'loss': 0.8674753904342651, 'acc': 0.71875, 'step': 821},\n",
       "  {'loss': 0.9841563701629639, 'acc': 0.625, 'step': 822},\n",
       "  {'loss': 0.9325175285339355, 'acc': 0.5625, 'step': 823},\n",
       "  {'loss': 0.812848687171936, 'acc': 0.6875, 'step': 824},\n",
       "  {'loss': 0.8495899438858032, 'acc': 0.6875, 'step': 825},\n",
       "  {'loss': 0.6906695365905762, 'acc': 0.78125, 'step': 826},\n",
       "  {'loss': 0.830631673336029, 'acc': 0.65625, 'step': 827},\n",
       "  {'loss': 0.9532807469367981, 'acc': 0.625, 'step': 828},\n",
       "  {'loss': 0.6615021824836731, 'acc': 0.65625, 'step': 829},\n",
       "  {'loss': 0.8904321193695068, 'acc': 0.65625, 'step': 830},\n",
       "  {'loss': 0.8653128147125244, 'acc': 0.6875, 'step': 831},\n",
       "  {'loss': 0.9431251287460327, 'acc': 0.65625, 'step': 832},\n",
       "  {'loss': 0.8205129504203796, 'acc': 0.71875, 'step': 833},\n",
       "  {'loss': 0.7509582042694092, 'acc': 0.75, 'step': 834},\n",
       "  {'loss': 0.802150309085846, 'acc': 0.65625, 'step': 835},\n",
       "  {'loss': 0.9462009072303772, 'acc': 0.59375, 'step': 836},\n",
       "  {'loss': 0.8912372589111328, 'acc': 0.78125, 'step': 837},\n",
       "  {'loss': 0.6321699023246765, 'acc': 0.78125, 'step': 838},\n",
       "  {'loss': 1.0705726146697998, 'acc': 0.65625, 'step': 839},\n",
       "  {'loss': 0.8638794422149658, 'acc': 0.65625, 'step': 840},\n",
       "  {'loss': 0.7611479759216309, 'acc': 0.78125, 'step': 841},\n",
       "  {'loss': 0.8087233901023865, 'acc': 0.71875, 'step': 842},\n",
       "  {'loss': 0.9087471961975098, 'acc': 0.625, 'step': 843},\n",
       "  {'loss': 0.9926931262016296, 'acc': 0.65625, 'step': 844},\n",
       "  {'loss': 0.8850944638252258, 'acc': 0.65625, 'step': 845},\n",
       "  {'loss': 0.7990764379501343, 'acc': 0.6875, 'step': 846},\n",
       "  {'loss': 0.8522297143936157, 'acc': 0.65625, 'step': 847},\n",
       "  {'loss': 1.1678658723831177, 'acc': 0.65625, 'step': 848},\n",
       "  {'loss': 0.651458203792572, 'acc': 0.8125, 'step': 849},\n",
       "  {'loss': 0.8719313740730286, 'acc': 0.625, 'step': 850},\n",
       "  {'loss': 1.011672854423523, 'acc': 0.625, 'step': 851},\n",
       "  {'loss': 0.7460658550262451, 'acc': 0.71875, 'step': 852},\n",
       "  {'loss': 0.6477586627006531, 'acc': 0.8125, 'step': 853},\n",
       "  {'loss': 1.0459747314453125, 'acc': 0.53125, 'step': 854},\n",
       "  {'loss': 1.0508949756622314, 'acc': 0.5, 'step': 855},\n",
       "  {'loss': 0.8780799508094788, 'acc': 0.625, 'step': 856},\n",
       "  {'loss': 0.8827557563781738, 'acc': 0.78125, 'step': 857},\n",
       "  {'loss': 0.9061411023139954, 'acc': 0.71875, 'step': 858},\n",
       "  {'loss': 0.9247214794158936, 'acc': 0.65625, 'step': 859},\n",
       "  {'loss': 1.0076640844345093, 'acc': 0.6875, 'step': 860},\n",
       "  {'loss': 0.9803377389907837, 'acc': 0.625, 'step': 861},\n",
       "  {'loss': 0.7583392262458801, 'acc': 0.75, 'step': 862},\n",
       "  {'loss': 0.7618056535720825, 'acc': 0.6875, 'step': 863},\n",
       "  {'loss': 0.6978466510772705, 'acc': 0.75, 'step': 864},\n",
       "  {'loss': 0.8683173656463623, 'acc': 0.6875, 'step': 865},\n",
       "  {'loss': 0.8074606657028198, 'acc': 0.65625, 'step': 866},\n",
       "  {'loss': 0.846278965473175, 'acc': 0.6875, 'step': 867},\n",
       "  {'loss': 0.8188237547874451, 'acc': 0.6875, 'step': 868},\n",
       "  {'loss': 1.0290967226028442, 'acc': 0.6875, 'step': 869},\n",
       "  {'loss': 0.752095639705658, 'acc': 0.75, 'step': 870},\n",
       "  {'loss': 1.1731511354446411, 'acc': 0.59375, 'step': 871},\n",
       "  {'loss': 0.9370335340499878, 'acc': 0.625, 'step': 872},\n",
       "  {'loss': 0.9035372138023376, 'acc': 0.59375, 'step': 873},\n",
       "  {'loss': 0.9303232431411743, 'acc': 0.5625, 'step': 874},\n",
       "  {'loss': 0.9199743866920471, 'acc': 0.6875, 'step': 875},\n",
       "  {'loss': 0.8340678811073303, 'acc': 0.71875, 'step': 876},\n",
       "  {'loss': 0.6648615002632141, 'acc': 0.8125, 'step': 877},\n",
       "  {'loss': 0.8752343058586121, 'acc': 0.6875, 'step': 878},\n",
       "  {'loss': 0.7603843212127686, 'acc': 0.71875, 'step': 879},\n",
       "  {'loss': 1.078706979751587, 'acc': 0.5, 'step': 880},\n",
       "  {'loss': 0.9458962678909302, 'acc': 0.625, 'step': 881},\n",
       "  {'loss': 0.8492446541786194, 'acc': 0.65625, 'step': 882},\n",
       "  {'loss': 1.0445172786712646, 'acc': 0.625, 'step': 883},\n",
       "  {'loss': 0.9063770771026611, 'acc': 0.65625, 'step': 884},\n",
       "  {'loss': 0.6886600255966187, 'acc': 0.84375, 'step': 885},\n",
       "  {'loss': 0.7070067524909973, 'acc': 0.75, 'step': 886},\n",
       "  {'loss': 0.8238896727561951, 'acc': 0.78125, 'step': 887},\n",
       "  {'loss': 0.5653353333473206, 'acc': 0.8125, 'step': 888},\n",
       "  {'loss': 0.6475790143013, 'acc': 0.75, 'step': 889},\n",
       "  {'loss': 0.8817811012268066, 'acc': 0.65625, 'step': 890},\n",
       "  {'loss': 1.0946727991104126, 'acc': 0.59375, 'step': 891},\n",
       "  {'loss': 0.9420414566993713, 'acc': 0.6875, 'step': 892},\n",
       "  {'loss': 0.7193787693977356, 'acc': 0.71875, 'step': 893},\n",
       "  {'loss': 0.7917693853378296, 'acc': 0.71875, 'step': 894},\n",
       "  {'loss': 0.8874315619468689, 'acc': 0.75, 'step': 895},\n",
       "  {'loss': 0.8876314759254456, 'acc': 0.625, 'step': 896},\n",
       "  {'loss': 0.7503048181533813, 'acc': 0.65625, 'step': 897},\n",
       "  {'loss': 0.7957677245140076, 'acc': 0.65625, 'step': 898},\n",
       "  {'loss': 0.895673394203186, 'acc': 0.6875, 'step': 899},\n",
       "  {'loss': 1.0268645286560059, 'acc': 0.59375, 'step': 900},\n",
       "  {'loss': 0.7841729521751404, 'acc': 0.6875, 'step': 901},\n",
       "  {'loss': 0.7538402676582336, 'acc': 0.65625, 'step': 902},\n",
       "  {'loss': 0.9920565485954285, 'acc': 0.59375, 'step': 903},\n",
       "  {'loss': 0.7906596064567566, 'acc': 0.5625, 'step': 904},\n",
       "  {'loss': 0.8546971678733826, 'acc': 0.59375, 'step': 905},\n",
       "  {'loss': 0.9060907363891602, 'acc': 0.65625, 'step': 906},\n",
       "  {'loss': 0.8895156383514404, 'acc': 0.65625, 'step': 907},\n",
       "  {'loss': 1.00627601146698, 'acc': 0.625, 'step': 908},\n",
       "  {'loss': 0.9006090760231018, 'acc': 0.6875, 'step': 909},\n",
       "  {'loss': 0.7604092955589294, 'acc': 0.75, 'step': 910},\n",
       "  {'loss': 0.8379680514335632, 'acc': 0.65625, 'step': 911},\n",
       "  {'loss': 0.7685379981994629, 'acc': 0.6875, 'step': 912},\n",
       "  {'loss': 0.9142845869064331, 'acc': 0.625, 'step': 913},\n",
       "  {'loss': 0.9650546908378601, 'acc': 0.625, 'step': 914},\n",
       "  {'loss': 0.7426725625991821, 'acc': 0.875, 'step': 915},\n",
       "  {'loss': 0.917605996131897, 'acc': 0.59375, 'step': 916},\n",
       "  {'loss': 0.7530182600021362, 'acc': 0.71875, 'step': 917},\n",
       "  {'loss': 0.8020361065864563, 'acc': 0.65625, 'step': 918},\n",
       "  {'loss': 0.7544976472854614, 'acc': 0.65625, 'step': 919},\n",
       "  {'loss': 0.8656024932861328, 'acc': 0.625, 'step': 920},\n",
       "  {'loss': 0.8244798183441162, 'acc': 0.59375, 'step': 921},\n",
       "  {'loss': 0.8017847537994385, 'acc': 0.71875, 'step': 922},\n",
       "  {'loss': 0.8370254635810852, 'acc': 0.6875, 'step': 923},\n",
       "  {'loss': 1.069184422492981, 'acc': 0.5625, 'step': 924},\n",
       "  {'loss': 1.0609899759292603, 'acc': 0.59375, 'step': 925},\n",
       "  {'loss': 0.7434123754501343, 'acc': 0.71875, 'step': 926},\n",
       "  {'loss': 0.8378084301948547, 'acc': 0.65625, 'step': 927},\n",
       "  {'loss': 0.7030841708183289, 'acc': 0.75, 'step': 928},\n",
       "  {'loss': 0.8498860001564026, 'acc': 0.71875, 'step': 929},\n",
       "  {'loss': 0.7614891529083252, 'acc': 0.65625, 'step': 930},\n",
       "  {'loss': 0.9603867530822754, 'acc': 0.625, 'step': 931},\n",
       "  {'loss': 0.6041615605354309, 'acc': 0.8125, 'step': 932},\n",
       "  {'loss': 0.6882292628288269, 'acc': 0.71875, 'step': 933},\n",
       "  {'loss': 0.7842264771461487, 'acc': 0.71875, 'step': 934},\n",
       "  {'loss': 0.7972140312194824, 'acc': 0.625, 'step': 935},\n",
       "  {'loss': 0.8806296586990356, 'acc': 0.6875, 'step': 936},\n",
       "  {'loss': 0.5643723607063293, 'acc': 0.8125, 'step': 937},\n",
       "  {'loss': 0.715570867061615, 'acc': 0.6875, 'step': 938},\n",
       "  {'loss': 0.9116525650024414, 'acc': 0.65625, 'step': 939},\n",
       "  {'loss': 0.8760276436805725, 'acc': 0.59375, 'step': 940},\n",
       "  {'loss': 0.9081963300704956, 'acc': 0.5625, 'step': 941},\n",
       "  {'loss': 0.8053896427154541, 'acc': 0.625, 'step': 942},\n",
       "  {'loss': 0.8543461561203003, 'acc': 0.625, 'step': 943},\n",
       "  {'loss': 0.967744767665863, 'acc': 0.53125, 'step': 944},\n",
       "  {'loss': 0.93202805519104, 'acc': 0.59375, 'step': 945},\n",
       "  {'loss': 0.9598735570907593, 'acc': 0.53125, 'step': 946},\n",
       "  {'loss': 0.938942015171051, 'acc': 0.5625, 'step': 947},\n",
       "  {'loss': 0.7626945376396179, 'acc': 0.6875, 'step': 948},\n",
       "  {'loss': 0.8165546655654907, 'acc': 0.75, 'step': 949},\n",
       "  {'loss': 0.6584270596504211, 'acc': 0.8125, 'step': 950},\n",
       "  {'loss': 0.8408780694007874, 'acc': 0.59375, 'step': 951},\n",
       "  {'loss': 0.8997963666915894, 'acc': 0.5625, 'step': 952},\n",
       "  {'loss': 0.7957451343536377, 'acc': 0.75, 'step': 953},\n",
       "  {'loss': 0.7075244188308716, 'acc': 0.65625, 'step': 954},\n",
       "  {'loss': 0.832436740398407, 'acc': 0.625, 'step': 955},\n",
       "  {'loss': 0.7887504696846008, 'acc': 0.71875, 'step': 956},\n",
       "  {'loss': 0.712906539440155, 'acc': 0.6875, 'step': 957},\n",
       "  {'loss': 0.6754156947135925, 'acc': 0.71875, 'step': 958},\n",
       "  {'loss': 1.3331876993179321, 'acc': 0.5, 'step': 959},\n",
       "  {'loss': 1.0026668310165405, 'acc': 0.53125, 'step': 960},\n",
       "  {'loss': 0.7149205207824707, 'acc': 0.6875, 'step': 961},\n",
       "  {'loss': 0.8165380954742432, 'acc': 0.6875, 'step': 962},\n",
       "  {'loss': 0.7566015124320984, 'acc': 0.65625, 'step': 963},\n",
       "  {'loss': 0.7871054410934448, 'acc': 0.625, 'step': 964},\n",
       "  {'loss': 0.673458456993103, 'acc': 0.71875, 'step': 965},\n",
       "  {'loss': 0.7362472414970398, 'acc': 0.75, 'step': 966},\n",
       "  {'loss': 0.5916094183921814, 'acc': 0.78125, 'step': 967},\n",
       "  {'loss': 0.7386534810066223, 'acc': 0.6875, 'step': 968},\n",
       "  {'loss': 0.7562335133552551, 'acc': 0.71875, 'step': 969},\n",
       "  {'loss': 1.0417784452438354, 'acc': 0.5625, 'step': 970},\n",
       "  {'loss': 0.7806553244590759, 'acc': 0.65625, 'step': 971},\n",
       "  {'loss': 0.8010558485984802, 'acc': 0.75, 'step': 972},\n",
       "  {'loss': 0.8701770901679993, 'acc': 0.6875, 'step': 973},\n",
       "  {'loss': 0.6499664187431335, 'acc': 0.75, 'step': 974},\n",
       "  {'loss': 0.6565089821815491, 'acc': 0.8125, 'step': 975},\n",
       "  {'loss': 0.8742100596427917, 'acc': 0.59375, 'step': 976},\n",
       "  {'loss': 0.666892409324646, 'acc': 0.75, 'step': 977},\n",
       "  {'loss': 0.8500058054924011, 'acc': 0.6875, 'step': 978},\n",
       "  {'loss': 0.785333514213562, 'acc': 0.71875, 'step': 979},\n",
       "  {'loss': 0.9941555857658386, 'acc': 0.5625, 'step': 980},\n",
       "  {'loss': 0.9048048853874207, 'acc': 0.6875, 'step': 981},\n",
       "  {'loss': 0.7698044776916504, 'acc': 0.65625, 'step': 982},\n",
       "  {'loss': 0.6528210639953613, 'acc': 0.71875, 'step': 983},\n",
       "  {'loss': 0.7655636072158813, 'acc': 0.59375, 'step': 984},\n",
       "  {'loss': 0.7287359237670898, 'acc': 0.625, 'step': 985},\n",
       "  {'loss': 1.1160507202148438, 'acc': 0.53125, 'step': 986},\n",
       "  {'loss': 0.5891777276992798, 'acc': 0.78125, 'step': 987},\n",
       "  {'loss': 0.6452481150627136, 'acc': 0.71875, 'step': 988},\n",
       "  {'loss': 0.7538845539093018, 'acc': 0.71875, 'step': 989},\n",
       "  {'loss': 0.8749246001243591, 'acc': 0.6875, 'step': 990},\n",
       "  {'loss': 1.0068304538726807, 'acc': 0.53125, 'step': 991},\n",
       "  {'loss': 0.9669674634933472, 'acc': 0.59375, 'step': 992},\n",
       "  {'loss': 0.9492063522338867, 'acc': 0.5, 'step': 993},\n",
       "  {'loss': 0.7353523969650269, 'acc': 0.8125, 'step': 994},\n",
       "  {'loss': 0.7753301858901978, 'acc': 0.71875, 'step': 995},\n",
       "  {'loss': 0.8972092866897583, 'acc': 0.65625, 'step': 996},\n",
       "  {'loss': 1.0097641944885254, 'acc': 0.59375, 'step': 997},\n",
       "  {'loss': 0.6658053398132324, 'acc': 0.78125, 'step': 998},\n",
       "  {'loss': 0.8127389550209045, 'acc': 0.6875, 'step': 999},\n",
       "  ...],\n",
       " 'val': [{'loss': 2.2973742614538906, 'acc': 0.104, 'step': 0},\n",
       "  {'loss': 0.8281021393335666, 'acc': 0.6811, 'step': 1000},\n",
       "  {'loss': 0.6562383360565661, 'acc': 0.7697, 'step': 2000},\n",
       "  {'loss': 0.576320403014509, 'acc': 0.7988, 'step': 3000},\n",
       "  {'loss': 0.5365202126030724, 'acc': 0.8124, 'step': 4000},\n",
       "  {'loss': 0.5264745880239687, 'acc': 0.8098, 'step': 5000},\n",
       "  {'loss': 0.4974674620091344, 'acc': 0.8227, 'step': 6000},\n",
       "  {'loss': 0.48412516075201306, 'acc': 0.8273, 'step': 7000},\n",
       "  {'loss': 0.47588649958657764, 'acc': 0.8328, 'step': 8000},\n",
       "  {'loss': 0.5030104254190915, 'acc': 0.8191, 'step': 9000},\n",
       "  {'loss': 0.4715334799723884, 'acc': 0.832, 'step': 10000},\n",
       "  {'loss': 0.45294057058926207, 'acc': 0.8368, 'step': 11000},\n",
       "  {'loss': 0.4500984463828821, 'acc': 0.8387, 'step': 12000},\n",
       "  {'loss': 0.44032676927388287, 'acc': 0.8428, 'step': 13000},\n",
       "  {'loss': 0.4439427801928581, 'acc': 0.8433, 'step': 14000},\n",
       "  {'loss': 0.4353902335412586, 'acc': 0.8406, 'step': 15000},\n",
       "  {'loss': 0.41583906397366294, 'acc': 0.8531, 'step': 16000},\n",
       "  {'loss': 0.40904555486413996, 'acc': 0.8537, 'step': 17000},\n",
       "  {'loss': 0.43166597056598327, 'acc': 0.85, 'step': 18000},\n",
       "  {'loss': 0.40621399184385426, 'acc': 0.855, 'step': 19000},\n",
       "  {'loss': 0.40543004877555866, 'acc': 0.8554, 'step': 20000},\n",
       "  {'loss': 0.40445467084646225, 'acc': 0.8547, 'step': 21000},\n",
       "  {'loss': 0.38738304628922154, 'acc': 0.8601, 'step': 22000},\n",
       "  {'loss': 0.39140351611775714, 'acc': 0.8606, 'step': 23000},\n",
       "  {'loss': 0.3870285269313346, 'acc': 0.8632, 'step': 24000},\n",
       "  {'loss': 0.402305784459693, 'acc': 0.8575, 'step': 25000},\n",
       "  {'loss': 0.37904236553766474, 'acc': 0.8627, 'step': 26000},\n",
       "  {'loss': 0.37759787873766676, 'acc': 0.8631, 'step': 27000},\n",
       "  {'loss': 0.3906245778282039, 'acc': 0.8622, 'step': 28000},\n",
       "  {'loss': 0.3762309065165992, 'acc': 0.8646, 'step': 29000},\n",
       "  {'loss': 0.3702960906389613, 'acc': 0.8677, 'step': 30000},\n",
       "  {'loss': 0.374295937212797, 'acc': 0.8633, 'step': 31000},\n",
       "  {'loss': 0.36683349175670277, 'acc': 0.8683, 'step': 32000},\n",
       "  {'loss': 0.3675095692467385, 'acc': 0.8645, 'step': 33000},\n",
       "  {'loss': 0.3569417917571319, 'acc': 0.8715, 'step': 34000}]}"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 17
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-25T08:34:07.981585Z",
     "start_time": "2025-01-25T08:34:07.794746Z"
    }
   },
   "source": [
    "#画线要注意的是损失是不一定在0到1之间的\n",
    "def plot_learning_curves(record_dict, sample_step=500):\n",
    "    # build DataFrame\n",
    "    # 字典取出来是列表，列表里是一个一个字典，set_index(\"step\")把step作为索引，iloc[::sample_step]每ample_step步取一行\n",
    "    train_df = pd.DataFrame(record_dict[\"train\"]).set_index(\"step\").iloc[::sample_step]\n",
    "    val_df = pd.DataFrame(record_dict[\"val\"]).set_index(\"step\")\n",
    "    \n",
    "    print(train_df.head())\n",
    "    print(val_df.head())\n",
    "\n",
    "    # plot\n",
    "    fig_num = len(train_df.columns)  # 因为有loss和acc两个指标，所以画2个子图\n",
    "    fig, axs = plt.subplots(1, fig_num, figsize=(5 * fig_num, 5)) #fig_num个子图，figsize是子图大小\n",
    "    for idx, item in enumerate(train_df.columns):    \n",
    "        # index是步数，item是指标名\n",
    "        axs[idx].plot(train_df.index, train_df[item], label=f\"train_{item}\")\n",
    "        axs[idx].plot(val_df.index, val_df[item], label=f\"val_{item}\")\n",
    "        axs[idx].grid()\n",
    "        axs[idx].legend()\n",
    "        x_data=range(0, train_df.index[-1], 5000) #每隔5000步标出一个点\n",
    "        axs[idx].set_xticks(x_data)\n",
    "        # map 函数用于将一个函数应用到一个可迭代对象的每个元素上，并返回一个迭代器。比如其内容为[\"1k\", \"2k\", \"5k\", \"7k\", \"10k\"]，则map(lambda x: f\"{int(x/1000)}k\", x_data)的结果为[\"1k\", \"2k\", \"5k\", \"7k\", \"10k\"]\n",
    "        axs[idx].set_xticklabels(map(lambda x: f\"{int(x/1000)}k\", x_data)) # map生成labal\n",
    "        axs[idx].set_xlabel(\"step\")\n",
    "    \n",
    "    plt.show()\n",
    "\n",
    "plot_learning_curves(record, sample_step=500)  #横坐标是 steps"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "          loss      acc\n",
      "step                   \n",
      "0     2.298416  0.12500\n",
      "500   1.134975  0.68750\n",
      "1000  1.058088  0.65625\n",
      "1500  0.652816  0.84375\n",
      "2000  0.516048  0.78125\n",
      "          loss     acc\n",
      "step                  \n",
      "0     2.297374  0.1040\n",
      "1000  0.828102  0.6811\n",
      "2000  0.656238  0.7697\n",
      "3000  0.576320  0.7988\n",
      "4000  0.536520  0.8124\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 1000x500 with 2 Axes>"
      ],
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 18
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 评估"
   ]
  },
  {
   "cell_type": "code",
   "source": [
    "model = NeuralNetwork() #上线时加载模型\n",
    "model = model.to(device)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-01-25T08:34:17.374232Z",
     "start_time": "2025-01-25T08:34:17.369593Z"
    }
   },
   "outputs": [],
   "execution_count": 20
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-25T08:34:20.148016Z",
     "start_time": "2025-01-25T08:34:18.673332Z"
    }
   },
   "source": [
    "# dataload for evaluating\n",
    "\n",
    "# 模型保存有2种，一种是保存模型结构和模型参数，一种是只保存模型参数，这里只保存参数，加上weights_only=True\n",
    "# load checkpoints\n",
    "model.load_state_dict(torch.load(\"checkpoints/best.ckpt\", weights_only=True, map_location=\"cpu\"))\n",
    "\n",
    "model.eval()\n",
    "loss, acc = evaluating(model, val_loader, loss_fct)\n",
    "print(f\"loss:     {loss:.4f}\\naccuracy: {acc:.4f}\")"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss:     0.3569\n",
      "accuracy: 0.8715\n"
     ]
    }
   ],
   "execution_count": 21
  },
  {
   "metadata": {},
   "cell_type": "code",
   "outputs": [],
   "execution_count": null,
   "source": ""
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "pytorch",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.8"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
